⭐二分查找
// orderArr是升序数组
public int binarySearch(int[] orderArr, int target) {
int l = 0, r = orderArr.length - 1;
while (l <= r) {
int mid = (l + r) >> 1;
if (target == orderArr[mid]) {
return mid;
} else if (target > orderArr[mid]) {
l = mid + 1;
} else {
r = mid - 1;
}
}
// 找不到返回-1
return -1;
}
⭐找出数组中重复的数字
🚀 题目链接:https://www.acwing.com/problem/content/14/
🚀 代码
public int duplicateInArray(int[] nums) {
if (null == nums) {
return -1;
}
// 如果数组中有元素小于0或大于数组长度,则直接返回-1
for (int num : nums) {
if (num < 0 || num > nums.length) {
return -1;
}
}
int id = 0;
while (id < nums.length) {
int num = nums[id];
if (num != id) {
// 当前元素不在对应索引位置上
if (nums[num] == num) {
// 对应索引位置已有相同元素,则该元素就是重复元素
return num;
} else {
// 暂无重复元素,则交换
int temp = nums[num];
nums[num] = nums[id];
nums[id] = temp;
}
} else {
id++;
}
}
return -1;
}
⭐不修改数组找出重复的数字
🚀 题目链接:https://www.acwing.com/problem/content/description/15/
🚀 代码
- 求解方式①:二分查找
public int duplicateInArray(int[] nums) { if (null == nums) { return -1; } // l和r是数组元素范围,不是索引 int l = 1, r = nums.length - 1; while (l < r) { int mid = (l + r) >> 1; // 统计数组中在区间[l,mid]内的元素个数 int count = 0; for (int num : nums) { if (num >= l && num <= mid) { count++; } } // count与区间长度比较 if (count > mid - l + 1) { // 超过区间长度,说明左边有重复值 r = mid; } else { // 没有超过区间长度,说明重复值在右边 l = mid + 1; } } return r; }
- 求解方式②:将数组看成有环的链表,找环的起点(AcWing 14. 不修改数组找出重复的数字 - O(n)解法)
public int duplicateInArray(int[] nums) { if (null == nums) { return -1; } // 快慢指针 int fast = 0, slow = 0; while (fast == 0 || slow != fast) { // fast走两步 fast = nums[nums[fast]]; // slow走一步 slow = nums[slow]; } // 再找环的起点,就是重复值 int temp = 0; while (temp != slow) { // 都走一步 temp = nums[temp]; slow = nums[slow]; } return slow; }
⭐二维数组中的查找
🚀 题目链接:https://www.acwing.com/problem/content/16/
🚀 代码
public boolean searchArray(int[][] array, int target) {
if (null == array || array.length == 0 || array[0].length == 0) {
return false;
}
// 行列指针始终指向右上角元素
int row = 0, col = array[0].length - 1;
while (row < array.length && col >= 0) {
if (target == array[row][col]) {
return true;
} else if (target < array[row][col]) {
// 右上角元素比目标值大,则去掉最后一列
row++;
} else {
// 右上角元素比目标值小,则去掉第一行
col--;
}
}
return false;
}
continue…