1 二分查找
二分查找题目链接
1.1 二分查找的使用前提
1.2 左闭右闭的写法-[L,R]
/**左闭右闭写法
* @param nums 传入一个有序数组
* @param target 需要找到的目标数字
* @return 返回的是target在数组中的index,若返回-1表示没有找到
*/
public static int searchBySlp01(int[] nums, int target) {
int left = 0
int right = nums.length - 1
//前提处理 判断目标数字是否在区间内
if (target < nums[0] || target > nums[nums.length - 1]) {
return -1
}
while (left <= right) {
int middle = (left + right) / 2
if (nums[middle] > target) {
right = middle - 1
} else if (nums[middle] < target) {
left = middle + 1
} else if (nums[middle] == target) {
return middle
}
}
return -1
}
1.3 左闭右开的写法-[L,R)
/**左闭右开写法 [L,R)
* @param nums 传入一个有序数组
* @param target 需要找到的目标数字
* @return 返回的是target在数组中的index,若返回-1表示没有找到
*/
public int searchBySlp02(int[] nums, int target) {
int left = 0, right = nums.length
//因为是左闭右开写法 [L,R) 所以L,R相等是矛盾的,所以只写<就行
while (left < right) {
int mid = left + ((right - left) >> 1);
if (nums[mid] == target) {
return mid
} else if (nums[mid] < target) {
/**
* 为什么不写成left = mid;
* 原因:因为num[mid] < target,所以L要往右移动到mid+1
* ,不是移动到mid是因为nums[mid] != target,那么把left=mid纳入循环没有意义
*/
left = mid + 1
} else if (nums[mid] > target) {
right = mid
}
}
return -1
}
2 移除元素
移除元素题目链接
2.1 暴力解法
public void removeBySlp01(int[] nums, int val) {
int size = nums.length;
for (int i = 0; i < size; i++) {
if (nums[i] == val) {
for (int j = i + 1; j < size; j++) {
nums[j - 1] = nums[j];
}
nums[size - 1] = 0;
i--;
size--;
}
}
System.out.println("size=" + size);
System.out.println("====数组====");
for (int i = 0; i < nums.length; i++) {
System.out.println(nums[i]);
}
}
2.2 双指针法
public void removeBySlp02(int[] nums, int val) {
int slow = 0;
for (int fast = 0; fast < nums.length; fast++) {
if (nums[fast] != val) {
nums[slow++] = nums[fast];
}
}
System.out.println("size=" + slow);
System.out.println("====数组====");
for (int i = 0; i < slow; i++) {
System.out.println(nums[i]);
}
}