小Q在学习许多排序算法之后灵机一动决定自己发明一种排序算法,小Q希望能将n个不同的数排序为升序。小Q发明的排序算法在每轮允许两种操作:
1、 将当前序列中前n-1个数排为升序
2、 将当前序列中后n-1个数排为升序
小Q可以任意次使用上述两种操作,小Q现在想考考你最少需要几次上述操作可以让序列变为升序。
小Q在学习许多排序算法之后灵机一动决定自己发明一种排序算法,小Q希望能将n个不同的数排序为升序。小Q发明的排序算法在每轮允许两种操作:
1、 将当前序列中前n-1个数排为升序
2、 将当前序列中后n-1个数排为升序
小Q可以任意次使用上述两种操作,小Q现在想考考你最少需要几次上述操作可以让序列变为升序。
输入包括两行,第一行包括一个正整数n(3≤n≤10^5),表示数字的个数
第二行包括n个正整数a[i](1≤a[i]≤10^9),即需要排序的数字,保证数字各不相同。
输出一个正整数,表示最少需要的操作次数
6 4 3 1 6 2 5
2
import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; /** * aMin: 序列中的最小值 * aMax: 序列中的最大值 * * 分三种情况: * (1)aMin和aMax都在正确位置,即 aMin==a[0] && aMax==a[n-1] * (2)aMin和aMax都不在正确位置,即 aMin!=a[0] && aMax!=a[n-1] * (3)aMin和aMax只有一个在正确位置,即 aMin==a[0] || aMax==a[n-1] * * res: 使整个序列变为升序所需要的最少操作次数 * 对于第一种情况:如果原序列已是升序,则res=0,否则res=1 * 对于第二种情况:如果aMax==a[0] && aMin==a[n-1],则res=3,否则res=2 * 对于第三种情况:res=1 * * @author wylu */ public class Main { public static void main(String[] args) throws IOException { BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); String line; while ((line = br.readLine()) != null) { int n = Integer.parseInt(line); int[] a = new int[n]; String[] strs = br.readLine().split(" "); for (int i = 0; i < n; i++) { a[i] = Integer.parseInt(strs[i]); } int aMin = a[0], aMax = a[0], res; boolean isSorted = true; for (int i = 1; i < n; i++) { aMin = Math.min(aMin, a[i]); aMax = Math.max(aMax, a[i]); if (a[i - 1] > a[i]) isSorted = false; } if (aMin != a[0] && aMax != a[n - 1]) res = (aMax == a[0] && aMin == a[n-1]) ? 3 : 2; else res = isSorted ? 0 : 1; System.out.println(res); } } }
1.先判断是否需要排序,不需要输出0
2.统计数组的最大值maxx和最小值minn,看原数组最后一个数与maxx和minn之间的关系:
#include<iostream>
#include<vector>
#include<limits.h>
#include<algorithm>
using namespace std;
int solve(vector<int>& nums, int n){
vector<int> nums_bak = nums;
sort(nums_bak.begin(),nums_bak.end());
bool needSort = false;
for (int i=0;i<n;i++){
if (nums_bak[i]!=nums[i]) needSort = true;
}
if (!needSort) return 0;
int maxx = INT_MIN, minn = INT_MAX;
for (auto d:nums){
if (d>maxx) maxx = d;
if (d<minn) minn = d;
}
if (nums[n-1]==maxx) return 1;
if (nums[n-1]==minn) return 3;
else return 2;
}
int main(){
int n;
cin>>n;
vector<int> nums(n,0);
for (int i=0;i<n;i++) cin>>nums[i];
cout<<solve(nums,n)<<endl;
}
import java.io.BufferedReader; import java.io.InputStreamReader; import java.io.IOException; public class Main { public static void main(String[] args) throws IOException { BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); int n = Integer.parseInt(br.readLine().trim()); String[] strArr = br.readLine().trim().split(" "); int[] arr = new int[n]; int min = Integer.MAX_VALUE; int max = Integer.MIN_VALUE; boolean isSorted = true; // 从数组中找到最大值和最小值,并判断有序性 for(int i = 0; i < n; i++) { arr[i] = Integer.parseInt(strArr[i]); if(min > arr[i]) min = arr[i]; if(max < arr[i]) max = arr[i]; if(i == 0) continue; else if(arr[i - 1] > arr[i]) isSorted = false; } if(arr[0] == min && arr[n - 1] == max){ // 如果最大值和最小值都在正确的位置 if(isSorted) // 如果已经有序就无需操作 System.out.println(0); else System.out.println(1); }else if(arr[0] != min && arr[n - 1] != max){ // 如果最大值和最小值都不在正确的位置 if(arr[0] == max && arr[n - 1] != min) // 最大最小值完全相反需要3次排序 System.out.println(3); else System.out.println(2); }else if(arr[0] != min || arr[n - 1] != max){ // 如果最大值和最小值有一个不在正确的位置 System.out.println(1); } } }
import java.util.Scanner; public class Main { public static void main(String[] args) { Scanner scan=new Scanner(System.in); while(scan.hasNext()){ int n=scan.nextInt(); int d0=0; int dl=0; int pre=0; int max=Integer.MIN_VALUE; int min=Integer.MAX_VALUE; int ans=0; for(int i=0;i<n;i++){ int tem=scan.nextInt(); if(pre>tem) ans=1; pre=tem; if(i==0) d0=tem; if(i==n-1) dl=tem; max=Integer.max(max,tem); min=Integer.min(min,tem); } if(ans==0){ System.out.println(0); }else{ if (min == d0) { System.out.println(1); }else if (max == dl) { System.out.println(1); }else if((d0==max&&dl!=min)||(d0!=max&&dl==min)){ System.out.println(2); }else if(d0==max&&dl==min){ System.out.println(3); }else{ System.out.println(2); } } } } }
import java.util.*; public class Main{ public static void main(String[] args){ Scanner sc = new Scanner(System.in); int n =sc.nextInt(); int[] arr = new int[n]; for(int i=0;i<n;i++){ arr[i] = sc.nextInt(); } int[] brr = new int[n]; for(int i=0;i<n;i++){ brr[i] = arr[i]; } Arrays.sort(brr); if(brr[0] == arr[0]||brr[n-1] == arr[n-1]){ System.out.println(1); }else if(brr[0] == arr[n-1]&&brr[n-1] == arr[0]){ System.out.println(3); }else{ System.out.println(2); } } }
#include <bits/stdc++.h> using namespace std; int main() { int n; while(cin>>n) { int a[n],Min=0X7f7f7f7f,Max=-1,p1=0,p2=0; for(int i=0;i<n;i++) { cin>>a[i]; if(a[i]<Min) { Min = a[i]; p1 = i; } if(a[i]>Max) { Max = a[i]; p2 = i; } } bool isSorted = true; int res = 0; if(p1==0 && p2==n-1) { for(int i=1;i<n;i++) { if(a[i]<a[i-1]){ isSorted = false; break; } } if(isSorted) res = 0; else res = 1; }else if(p1!=0 && p2!=n-1){ res = 2; }else if(p1==0 || p2==n-1){ res = 1; } cout<<res<<endl; } return 0; }
import java.util.*; public class Main { private static final int INT_MAX = 0X3F3F3F3F; private static final int INT_MIN = -0X3F3F3F3F; public static void main(String[] args) { Scanner sc = new Scanner(System.in); int n = sc.nextInt(); int min = INT_MAX, minIndex = -1, max = INT_MIN, maxIndex = -1; int ans = 2; int last = INT_MAX; boolean lastFlag = true; for (int i=1; i<=n; i++) { int now = sc.nextInt(); if (last != INT_MAX && last > now) { lastFlag = false; } last = now; if (now 1) { break; } } if (now > max) { max = now; maxIndex = i; } } if (lastFlag) { ans = 0; } else if (maxIndex == n || minIndex == 1 ) { ans = 1; } System.out.println(ans); return; } }
package main import ( "fmt" ) func main() { var n int fmt.Scan(&n) max,min:=0,1000000001 arr:=make([]int,n) for i:=0;i<n;i++{ fmt.Scan(&arr[i]) if arr[i]>max{ max=arr[i] } if arr[i]<min{ min=arr[i] } } if arr[n-1]==max||arr[0]==min{ fmt.Print(1) return } fmt.Print(2) }
#include <iostream> #include <vector> #include <algorithm> using namespace std; int main() { int n, res = 0; cin >> n; vector<int> v(n); for(int i = 0; i < n; i++){ cin >> v[i]; } while(!is_sorted(v.begin(), v.end())){ sort(v.begin(), v.end() - 1); sort(v.begin() + 1, v.end()); res += 2; } cout << res; return 0; }
import java.util.*; public class Main{ public static void main(String[] args){ Scanner sc = new Scanner(System.in); int n = sc.nextInt(); int[] arr = new int[n]; int[] a = new int[n]; for(int i =0;i<n;i++){ arr[i] = sc.nextInt(); a[i] = arr[i]; } Arrays.sort(a); boolean b = true; for(int i =0;i<n;i++){ if(a[i]!=arr[i]){ b = false; break; } } if(b) System.out.println(0); else if(a[0]==arr[0]||a[n-1]==arr[n-1]){ System.out.println(1); }else if(a[0] == arr[n-1]&&a[n-1] == arr[0]){ System.out.println(3); }else{ System.out.println(2); } } }
分四种情况
#include <iostream> #include <climits> using namespace std; // 判断最大值最小值位置? int main() { int n, min = INT_MAX, max = INT_MIN, min_index, max_index; int val, last_val = INT_MIN, flag = 2; cin >> n; for (int i = 1; i <= n; i++) { cin >> val; if (val < last_val) flag = 0; // 输入序列不是升序 last_val = val; // max尽可能靠右:>= if (val >= max) { max = val; max_index = i; } // min尽可能靠左:< if (val < min) { min = val; min_index = i; } } if (flag) cout << 0 << endl; else if (min_index == 1 || max_index == n) cout << 1 << endl; else if (min_index == n && max_index == 1) cout << 3 << endl; else cout << 2 << endl; return 0; }