704.二分查找
题目链接: https://leetcode.cn/problems/binary-search/
关键词:有序、整型数组
解法一:二分查找
注意:自己预设的区间是左闭右闭区间还是左闭右开
int search(int* nums, int numsSize, int target){
int left = 0, right = numsSize-1; //0~numsSize-1即默认了左闭右闭区间
while(left <= right){ //左闭右闭区间,要小于等于,因为left与right相等时也在判断范围内
int mid = left + (right - left) /2; //防止int溢出
if(target == nums[mid]){
return mid;
}else if(target < nums[mid]){
right = mid - 1;
}else{
left = mid + 1;
}
}
return -1;
}
心得:判断是否大于等于还是仅大于、是否要加1或减1等此类情况,就是看该数是否在你的判断区间内,如此题:while(left <= right) 要加上等于号,因为是左闭右闭区间,在left = right时,如[1,1]区间, 1是在你的判断区间内的,故需要等于号
解法二:暴力法
一个for循环即可
class Solution {
public:
int search(vector<int>& nums, int target) {
for(int i = 0; i < nums.size(); i++){ //注意c++中vector容量大小的写法
if(nums[i] == target){
return i;
}
}
return -1;
}
};
27.移除元素
题目链接: https://leetcode.cn/problems/remove-element/
关键词:数组
解法一:双指针法
class Solution {
public:
int removeElement(vector<int>& nums, int val) {
int slow = 0, length = nums.size();
for(int fast = 0; fast < nums.size(); fast++){ //快指针遍历数组
if(nums[fast] != val){ //碰到非目标元素才会把该元素保留
nums[slow] = nums[fast];
slow++; //慢指针更新非目标元素的下标,为目标元素时(即执行else时)slow相当于保持在目标元素的下标,方便fast找到非目标元素时进行目标元素的移除
}else{ //数组减小的时机就是nums[fast] = val
length--;
}
}
return length;
}
};
解法二:暴力法
两个for即可,第一个for遍历完整个数组,第二个for移动元素
class Solution {
public:
int removeElement(vector<int>& nums, int val) {
int length = nums.size();
for(int i = 0; i < length; i++){
if(nums[i] == val){
for(int j = i + 1; j < length; j++){ //若为最后一个元素则不会执行for,因为j<length(最后一个元素和前面的元素操作不同,最后一个元素直接length--)
nums[j - 1] = nums[j];
}
length--;
i--; //被移除元素的位置被新元素代替,故i--再判断一次这个位置
}
}
return length;
}
};