1.704.二分查找
题目链接:704. 二分查找 - 力扣(LeetCode)
(1):该情况是在左闭右闭的情况下。也就是[left,right]
C代码如下:
int search(int* nums, int numsSize, int target){
int left = 0;
int right = numSize-1;
int middle =0;
while(left<=right){//证明区间的元素不为0
middle = (left + right)/2;
if(nums[middle] > target){//目标值可能在[left,miidle-1]
right = middle-1;
}
else if(nums[midddle]<target){//目标值可能在[middle+1,right]
left = middle+1;
}
else if(nums[middle]==target){
return middle;
}
}
return -1;
}
(2):该情况是在左闭右开,也就是[left,right)
C代码如下:
int search(int* nums, int numsSize, int target){
int length = 0;
int left = 0;
int right =length;
int middle = 0;
while(left<right){//因为是左闭右开,所以防止出现left==right
middle = left + (right - left)/2;
if(nums[middle]<target){
left = middle + 1;
}
else if(nums[middle]>target){
right = middle;
}
else if(nums[middle]==target){
retunr middle;
}
}
return -1;
}
总结:
面对这种一组数想要查找其中数的位置,最容易也是最先能想到的就是二分查找,在二分查找中主要有两种情况,分别为:左闭右闭和左闭右开。但两者的方法是不同的,最主right的最后赋值,在左闭右闭中因为当前nums[middle]一定不是target,所以要赋值middle-1,在左闭右开中右区间是开,而此时要去左区间寻找,所以right此时要赋值middle。
27.移除元素
题目链接: 27. 移除元素 - 力扣(LeetCode)
两种解法:暴力法,双指针法(精髓)
(1):暴力法:两层for循环,第一层遍历整个数组,之后遍历更新后的数组
(2):双指针法
C代码如下:
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];
}
}
return slow;
}
总结:
暴力法不做过多解释,双指针可以极大简化代码,关于双指针就是有快指针和慢指针,当快指针所找的元素不等于所要求寻找的元素,就会将该元素向前覆盖一位。归结一句话:通过快指针和慢指针在一个for循环下可以完成两个for循环的工作。