💡 解题思路
- 📝 确定输入与输出
- 🔍 分析复杂度
- 🔨 复杂题目拆分 :严谨且完整 地拆分为更小的子问题
- 💭 选择处理逻辑: 根据拆分后的子问题,总结并选择合适的问题处理思路
- 🔎 检查特殊情况:边界条件和特殊情况
- 🏁 返回结果
704. 二分查找 -----(二分)
[left, right) 左闭右开:右边界(right)为遍历过的值的下标mid(mid - 1 代表的值还没遍历,是可以取到的值)
class Solution {
public int search(int[] nums, int target) {
int left = 0, right = nums.length;
while (left < right) {
int mid = left + ((right - left) >> 1);
if (nums[mid] == target) {
return mid;
} else if (nums[mid] > target) {
right = mid; // 不能取到
} else {
left = mid + 1;
}
}
return -1;
}
}
[left, right] 左闭右闭
class Solution {
public int search(int[] nums, int target) {
int left = 0, right = nums.length-1;
while(left <= right) {
int mid = left + ((right - left) >> 1);
if (nums[mid] == target) return mid;
else if (nums[mid] < target) left = mid+1;
else right = mid-1; // 可以取到
}
return -1;
}
}
27. 移除元素-----(双指针)
class Solution {
public int removeElement(int[] nums, int val) {
int i = 0, j = 0, len = nums.length;
while (i < len) {
if (nums[i] == val) i++;
else {
nums[j++] = nums[i++];
}
}
return j;
}
}