int[] nums = {2,1,4,3,6,5};
对于每个缝隙, 如果前缀的最大值小于等于后缀的最小值, 那么就可以在这里切
public int partitionArray(int[] nums) {
int res = 0;
int n = nums.length;
// maxLeft[k] [0,k]之间的nums最大值
int[] maxLeft = new int[n];
// minRight[k] [k, n-1]的nums最小值
int[] minRight = new int[n];
int max = nums[0];
for (int i = 0; i < n; i++) {
if (nums[i] > max) {
max = Math.max(max, nums[i]);
}
maxLeft[i] = max;
}
int min = nums[n-1];
for (int i = n-1; i >= 0; i--) {
if (nums[i] < min) {
min = Math.min(min, nums[i]);
}
minRight[i] = min;
}
for (int i = 0; i < n-1; i++) {
// 当左边最大值 <= 右边最小值 时可以进行切分
if (maxLeft[i] <= minRight[i+1]) {
int j = i + 1;
System.out.println(i + " - " + j);
res++;
}
}
return res;
}
public int partitionArray(int[] nums) {
int n = nums.length;
int count = 1;
int[] rightMin = new int[n];
int[] leftMax = new int[n];
rightMin[n-1] = nums[n-1];
for (int i = n-2; i >= 0; i--) {
if (nums[i] < rightMin[i+1]) {
rightMin[i] = nums[i];
} else {
rightMin[i] = rightMin[i+1];
}
}
leftMax[0] = nums[0];
for (int i = 1; i < n; i++) {
if (nums[i] > leftMax[i-1]) {
leftMax[i] = nums[i];
} else {
leftMax[i] = leftMax[i-1];
}
}
for (int i = 0; i < n-1; i++) {
if (leftMax[i] <= rightMin[i+1]) {
System.out.println(nums[i] + " -- " + nums[i+1]);
count++;
}
}
return count;
}
一个整数数组, 将这个数组划分为一些连续的子数组, 将各个子数组内部元素进行排序后,整个数组是有序的,问最多能切成多少个子数组
最新推荐文章于 2022-02-26 10:36:27 发布