数组相关知识:
- 数组的内存空间是连续的
- 数组元素只能被覆盖不能被删除
题目链接:Leetcode704二分查找
![](https://img-blog.csdnimg.cn/direct/f487c25980db430886b35823d2274bbc.png)
-
思路:
-
左闭右闭:
边界条件:left<=right
middle>target ——right=middle-1
middle<target ——left=middle+1
左闭右开:
边界条件:left<right
middle>target ——right=middle
middle<target ——left=middle+1
代码实现:
左闭右闭:
int search(int* nums, int numsSize, int target) {
int left = 0;
int right = numsSize-1;
int middle = 0;
while(left<=right){
middle=(right+left)/2;
if(nums[middle] > target) {
right = middle-1;
}
else if(nums[middle] < target) {
left = middle+1;
}
else
return middle;
}
return -1;
}
左闭右开:
int search(int* nums, int numsSize, int target) {
int left = 0;
int right = numsSize-1;
int middle = 0;
while(left<right){
middle=(right+left)/2;
if(nums[middle] > target) {
right = middle;
}
else if(nums[middle] < target) {
left = middle+1;
}
else
return middle;
}
return -1;
}
总结:
二分查找分两种情况,左闭右闭和左闭右开,编译时要注意边界条件。
题目链接:27.移除元素
思路:
- 暴力法:使用两个for循环,第一层循环查找等于val的值,第二层循环更新数组
- 双指针法:通过一个快指针和慢指针完成一次for循环 快指针:表示新数组的数值 慢指针:表示新数组数值下标
代码实现:
1.暴力法:
int removeElement(int* nums, int numsSize, int val) {
for(int i=0;i<numsSize;i++){
if(nums[i]==val){
for(int j=i+1;j<numsSize;j++){
nums[j-1]=nums[j];
}
i--;
numsSize--;
}
}
return numsSize;
}
注意:我在一开始写第二层循环时,将其写成nums[j]=nums[j+1],此时报如下错误:
当将nums[j]
设置为nums[j+1]
时,实际上是在尝试访问nums[numsSize]
,这是数组之外的位置(因为数组索引是从0到numsSize-1
的),所以报错。
2.双指针法
int removeElement(int* nums, int numsSize, int val) {
int slow=0;
for(int fast=0;fast<numsSize;fast++){
if(nums[fast]!=val){
nums[slow]=nums[fast];
slow++;
}
}
return slow;
}
总结:
双指针法定义了两个指针,关键在于理解各个指针的含义。