单调数组问题
-
数组单调有两种情况:单调递增、单调递减
-
如何判断数组是否为单调数组呢?(2023/08/11早)
/**
* 第一种方法,两次遍历确定,第一次确定是否递增 ,第二次
*
* @param nums
* @return
*/
public static boolean isMonotonic(int[] nums) {
// 递增或递减
return isSorted(nums, true) || isSorted(nums, false);
}
public static boolean isSorted(int[] nums, boolean increasing) {
int n = nums.length;
for (int i = 0; i < n - 1; ++i) {
// 1.递增
if (increasing) {
if (nums[i] > nums[i + 1]) {
return false;
}
// 2.递减
} else {
if (nums[i] < nums[i + 1]) {
return false;
}
}
}
return true;
}
/**
* 第二种方式,一次遍历确定
* 如果是递增的就一定不能出现递减的相邻元素,
* 如果出现递减的就一定不能出现递增的相邻元素。
*
* @param nums
* @return
*/
public static boolean isMonotonic_2(int[] nums) {
boolean inc = true, dec = true;
int n = nums.length;
for (int i = 0; i < n - 1; ++i) {
// 1.递增
if (nums[i] > nums[i + 1]) {
inc = false;
}
// 2.递减
if (nums[i] < nums[i + 1]) {
dec = false;
}
}
return inc || dec;
}
简单的二分查找
-
在单调数组中查找目标元素,最便捷的方法就是二分查找:(2023/08/11早)
/**
* 二分查找
*
* @param nums
* @param target 目标数字
* @return 下标
*/
public static int searchInsert(int[] nums, int target) {
int n = nums.length;
// 左边界, 右边界
int left = 0, right = n - 1, ans = n;
while (left <= right) {
// 中点
int mid = ((right - left) >> 1) + left;
if (target <= nums[mid]) {
ans = mid;
right = mid - 1;
} else {
left = mid + 1;
}
}
return ans;
}
数组合并
-
我们讨论单调数组的合并:两单调数组合并之后,结果仍然是单调数组
-
这样的数组合并有很多种方法:
-
新数组:创建一个新数组,依次比较两数组元素大小,存放
-
不新建数组
-
-
我们仅展示第二种做法:
/**
* 方法1:先合并再排序实现排序
*
* @param nums1 第一个数组
* @param nums1_len 第一个数组的长度
* @param nums2 第二个数组,将nums2合并到nums1中
* @param nums2_len 第二个数组的长度
*/
public static void merge1(int[] nums1, int nums1_len, int[] nums2, int nums2_len) {
for (int i = 0; i < nums2_len; ++i) {
nums1[nums1_len + i] = nums2[i];
}
Arrays.sort(nums1);
}
/**
* 方法2:两个数组从后向前逐步合并
*
* @param nums1
* @param nums1_len
* @param nums2
* @param nums2_len
*/
public static void merge2(int[] nums1, int nums1_len, int[] nums2, int nums2_len) {
int i = nums1_len + nums2_len - 1;
int len1 = nums1_len - 1, len2 = nums2_len - 1;
while (len1 >= 0 && len2 >= 0) {
if (nums1[len1] <= nums2[len2])
nums1[i--] = nums2[len2--];
else if (nums1[len1] > nums2[len2])
nums1[i--] = nums1[len1--];
}
//假如A或者B数组还有剩余
while (len2 != -1) nums1[i--] = nums2[len2--];
while (len1 != -1) nums1[i--] = nums1[len1--];
}