1.题目:给定一个 n
个元素有序的(升序)整型数组 nums
和一个目标值 target
,写一个函数搜索 nums
中的 target
,如果目标值存在返回下标,否则返回 -1
。
#二分要点:递增递减排序(有序)
#左闭右闭
int search(int* nums, int numsSize, int target) {
int left = 0;
int right = numsSize - 1;
int mid = 0;
while (left <= right) {
mid = (right + left) / 2;
if (nums[mid] > target) {
right = mid - 1;
} else if (nums[mid] < target) {
left = mid + 1;
} else{
return mid;
}
}
return -1;
}
#左闭右开
int search(int* nums, int numsSize, int target) {
int left = 0;
int right = numsSize; //右开默认在原数组下标+1,即等于数组个数
int mid = 0;
while(left < right){
mid = left + (right - left) / 2;
if (nums[mid] > target){
right = mid;
}
else if (nums[mid] < target){
left = mid + 1;
}
else{
return mid;
}
}
return -1;
}
2.题目:给你一个数组 nums
和一个值 val
,你需要 原地 移除所有数值等于 val
的元素。元素的顺序可能发生改变。然后返回 nums
中与 val
不同的元素的数量。
#双指针(快慢指针)的应用,理解两个指针含义
int removeElement(int* nums, int numsSize, int val) {
int fast = 0; //记录更新前的数组元素的下标,可以取出当前值
int slow = 0; //记录需要剔除的数组元素的下标,这部分可以被fast替换
for(fast; fast < numsSize; fast++){
if (nums[fast] != val){ //判断元素是否为剔除元素
nums[slow] = nums[fast];
slow++;
}
}
return slow; //返回前已经被+1了,由于数组是下标是0开头,所以返回的是最后剔除后元素下标,即新数组的元素个数
}