LeetCode 704-二分查找
题目描述:给定一个 n 个元素有序的(升序)整型数组 nums 和一个目标值 target ,写一个函数搜索 nums 中的 target,如果目标值存在返回下标,否则返回 -1。
思路:
- 该题是一个有序且无重复元素的整型数组,满足二分法的使用条件
- 二分法注意点:写二分法,区间的定义一般为两种,左闭右闭即[left, right],或者左闭右开即[left, right)。
- 我选择左闭右开,while寻找中每一次边界的处理都要坚持根据区间的定义来操作,左闭右开的话,left=right就没有意义
二分法-左闭右开
int search(int* nums, int numsSize, int target){
int left = 0, right = numsSize, mid = 0;
while(left < right)//左闭右开区间,left==right无意义
{
mid = left + ((right-left) >> 1);
if(target < nums[mid])
{
right = mid;//target在左区间,在[left,mid)中
}
else if(target > nums[mid])
{
left = mid + 1;//target在右区间,在[mid+1,right)中
}
else
{
return mid;//找到目标值
}
}
return -1;
}
总结
- 学习到二分法while循环中每一次边界的处理都要坚持根据区间的定义来操作
- mid值的计算:mid = left + ((right-left) >> 1),是为了防止left和right较大时会有溢出
LeetCode 27-移除元素
题目描述:给你一个数组 nums 和一个值 val,你需要原地移除所有数值等于val的元素,并返回移除后数组的新长度 leetcode.cn/problems/re…
思路:
双指针法(快慢指针法): 通过一个快指针和慢指针在一个for循环下完成两个for循环的工作。
定义快慢指针
- 快指针:寻找新数组的元素 ,新数组就是不含有目标元素的数组
- 慢指针:指向更新 新数组下标的位置
int removeElement(int* nums, int numsSize, int val){
int slow = 0;
for(int fast = 0;fast < numsSize;fast++)
{
if(val != nums[fast])
{
nums[slow++] = nums[fast];
}
}
return slow;
}
总结:
- 任何变量/指针都是有含义的,理清楚变量的含义,才能游刃有余