704.二分查找
关键点:对于左闭右闭区间和左闭右开区间的不同处理。
左闭右闭区间
- (R = nums.length - 1)
- while(L <= R )
class Solution {
public int search(int[] nums, int target) {
int R = nums.length-1;
int L = 0;
while (L <= R) {
int mid = L + (R - L) / 2;
if (nums[mid] == target) {
return mid;
} else if (nums[mid] > target) {
R = mid - 1;
} else {
L = mid + 1;
}
}
return -1;
}
}
左闭右开区间
- 右区间(R)的取值不同。(R = nums.length)
- 左闭右开区间,mid-1有取不到情况,要写mid
class Solution {
public int search(int[] nums, int target) {
//R的取值和左闭右闭不同
int R = nums.length;
int L = 0;
while (L < R) {
int mid = L + (R - L) / 2;
if (nums[mid] == target) {
return mid;
} else if (nums[mid] > target) {
//由于左闭右开区间,写mid-1的话,mid-1的值取不到
R = mid;
} else {
L = mid + 1;
}
}
return -1;
}
}
35.搜索插入位置
解题思路:
- 每次根据 nums[mid] 和 target 之间的大小进行判断,相等则直接返回下标,nums[mid] < target 则 left 右移,nums[mid] > target 则 right 左移
- 查找结束如果没有相等值则返回 left,该值为插入位置
- 时间复杂度:O(logn)
class Solution {
public int searchInsert(int[] nums, int target) {
int R = nums.length - 1;
int L = 0;
while (L <= R) {
int mid = L + (R - L) / 2;
if (nums[mid] == target) {
return mid;
} else if (nums[mid] > target) {
R = mid - 1;
} else {
L = mid + 1;
}
}
return L;
}
}
27.移除元素
- 双指针:右指针 (right) 指向当前将要处理的元素,左指针(L)指向下一个将要赋值的位置。
- 如果右指针指向的元素不等于 val,它一定是输出数组的一个元素,我们就将右指针指向的元素复制到左指针位置,然后将左右指针同时右移;
- 如果右指针指向的元素等于 val,它不能在输出数组里,此时左指针不动,右指针右移一位。
作者:LeetCode-Solution
链接:https://leetcode.cn/problems/remove-element/solution/yi-chu-yuan-su-by-leetcode-solution-svxi/
来源:力扣(LeetCode)
class Solution {
public int removeElement(int[] nums, int val) {
int L = 0;
for (int right = 0; right < nums.length; right++) {
if(nums[right]!=val){
nums[L] = nums[right];
L++;
}
}
return L;
}
}
博客围绕LeetCode上的题目展开,包括704.二分查找,介绍左闭右闭和左闭右开区间的不同处理;35.搜索插入位置,根据nums[mid]和target大小判断,未找到相等值则返回left为插入位置;27.移除元素,采用双指针法处理。

920

被折叠的 条评论
为什么被折叠?



