小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;
}
}
import java.util.Scanner;
import java.util.*;
// 注意类名必须为 Main, 不要有任何 package xxx 信息
public class Main {
private static int n;
private static int ans;
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
if (in.hasNextInt()) n = in.nextInt();
int[] arr = new int[n];
int minIndex = 0, maxIndex = 0;
for (int i = 0; i < n; i ++) {
if (in.hasNextInt()) arr[i] = in.nextInt();
if (arr[minIndex] > arr[i]) minIndex = i;
if (arr[maxIndex] < arr[i]) maxIndex = i;
}
ans = 2;
if (minIndex == n-1) ans++;
if (maxIndex == 0) ans ++;
System.out.println(ans);
}
} 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;
}