数组相关
704. 二分查找
思路
通过二分的思想进行解答,二分思想分左闭右开和左闭右闭两种。这两种的区别在于循环时是否包括右边界(l<r 和 l<=r) ,在代码中的体现就是开始在定义右边界的时候是否需要-1,以及在二分查找后中间值大鱼目标值时是否需要-1。
个人题解
左闭右开
class Solution {
public int search(int[] nums, int target) {
int n = nums.length-1;
int l = 0;
int r = n;
while(l <= r){
int mid = l + ((r-l) >> 1);
System.out.println(mid);
if(nums[mid]>target){
r = mid - 1;
}else if(nums[mid] < target){
l = mid + 1;
}else {
return mid;
}
}
return -1;
}
}
左闭右闭
class Solution {
public int search(int[] nums, int target) {
int n = nums.length;
int l = 0;
int r = n;
while(l < r){
int mid = l + ((r-l) >> 1);
System.out.println(mid);
if(nums[mid]>target){
r = mid ;
}else if(nums[mid] < target){
l = mid + 1;
}else {
return mid;
}
}
return -1;
}
}
27. 移除元素
思路
- 暴力解法
遍历数组然后在val相同的位置将其后的所有数向前移动长度-1。 - 双指针 通过遍历数组将和val不同的数组复制到当前数组的方法解决。
定义一个cur表示当前应该返回的数组最后的位置以及l表示遍历数组的位置。当nums[temp] != val时表示当前的位置上的数不是要删除的值,那么就将当前值复制到结果数组的最后位置之后将两个指针都向前移动,否则相同那么就将temp向后移动跳过temp位置的值。
个人题解
class Solution {
public int removeElement(int[] nums, int val) {
int cur = 0,temp = 0;
while(temp < nums.length){
if(nums[temp] != val){
nums[cur] = nums[temp];
cur++;
}
temp++;
}
return cur;
}
}