每日总结day01
写在前面:最近感冒了,嗓子疼的厉害,感觉到有个好身体才是做事情和学习的最大保障 ,呜呜呜
704|二分查找
题目
给定一个 n
个元素有序的(升序)整型数组 nums
和一个目标值 target
,写一个函数搜索 nums
中的 target
,如果目标值存在返回下标,否则返回 -1
。
思路
- 不断把数组一分为二然后探测数组中间值是否是目标值
- 如果目标值大于中间值,就取右区间继续探测
- 如果目标值小于中间值,就取左区间继续探测
新思想
-
循环不变量:要在心里清楚自己设置的区间到底是什么,其他的边界判断都要根据这个来
-
左闭右闭:我自己选择的是两边都是闭区间,所以在循环的时候边界条件是
while(left <= right)//因为取=的时候也是有意义的
-
在更新left和right时是更新为
left = middle + 1; right = middle - 1;
代码 ( [left, right]情况 )
class Solution {
public int search(int[] nums, int target) {
int left = 0;
int right = nums.length - 1;
while(left <= right) {
int mid = left + (right - left)/2;
if(target < nums[mid]) {
right = mid - 1;
} else if(target > nums[mid]) {
left = mid + 1;
} else {
return mid;
}
}
return -1;
}
}
27|移除元素
题目
给你一个数组 nums
和一个值 val
,你需要 原地 移除所有数值等于 val
的元素,并返回移除后数组的新长度。
思路
- 双指针法:通过设置快慢两个指针,快指针在前面先探测
- 快指针如果不是
val
就把快指针指向的值传给慢指针作为新数组当前最后一个,两个指针同时后移一位 - 如果是
val
,则快指针跳过这个向后移动
新思想
- 快慢指针:快指针在前面探测和处理,处理完的交给慢指针
代码
class Solution {
public int removeElement(int[] nums, int val) {
int fp = 0;
int sp = 0;
int length = nums.length;
for(; fp < length; fp++) {
if(nums[fp] != val) {
nums[sp++] = nums[fp];
}
}
return sp;
}
}