题目
思路:
1、输入数据
2、用冒泡排序将数组(下标为pj的)部分升序,
3、判断是否有前一个元素大于后一个元素(降序),有则返回false
注意:(1)数组p元素的取值不能大于数组a的长度,因为p元素是a的下标
(2)数组下标越界问题,使用i<a.length判断
(3)并非所有元素都要降序才返回false,只要有前一个元素大于后一个元素就返回false
import java.util.Arrays; import java.util.Scanner; public class MaoPaoDemo1 { public static void main(String[] args) { Scanner sc = new Scanner(System.in); int n = sc.nextInt(); int m = sc.nextInt(); int[] a = new int[n]; int[] p = new int[m]; for (int i = 0; i < n; i++) { a[i] = sc.nextInt(); } for (int i = 0; i < m; i++) { p[i] = sc.nextInt(); } //对p进行排序(p的元素大小不可能超过a的长度) Arrays.sort(p); //只对数组a下标为p[]的元素进行升序排序,得到部分升序数组a for (int j = 0; j < m; j++) { int max = p[j]-1; int i = p[j]; for (; i <= p[m - 1]&&i<a.length; i++) //前一个元素大于后一个元素就交换位置 if (a[max] > a[i]) { int t2 = a[max]; a[max] = a[i]; a[i] = t2; } } //f记录真假 boolean f = true; //只要有一个元素大于后一个元素就返回false,退出循环 for (int i = 0; i < a.length-1; i++) { if(a[i]>a[i+1]){ f=false;break;} } //这里是错误的,这里的条件太严格了,(此处是所有元素都降序才返回false) // for (int i = 0; i < n; i++) { // if (a[i] != arr[i]) {//若两次变换的数组有一个元素不相等,则代表true,跳出循环 // f = true; // break; // } else { // f = false; // } // } if (f) System.out.println("YES"); else System.out.println("NO"); } }