一.二分查找
1.左闭右闭
// 版本一
class Solution {
public:
int search(vector<int>& nums, int target) {
int left = 0;
int right = nums.size() - 1; // 定义target在左闭右闭的区间里,[left, right]
while (left <= right) { // 当left==right,区间[left, right]依然有效,所以用 <=
int middle = left + ((right - left) / 2);// 防止溢出 等同于(left + right)/2
if (nums[middle] > target) {
right = middle - 1; // target 在左区间,所以[left, middle - 1]
} else if (nums[middle] < target) {
left = middle + 1; // target 在右区间,所以[middle + 1, right]
} else { // nums[middle] == target
return middle; // 数组中找到目标值,直接返回下标
}
}
// 未找到目标值
return -1;
}
};
2.左闭右开
class Solution {
public:
int search(vector<int>& nums, int target) {
int L=0;
int R=nums.size();
while(L<R)
{
int mid=L+((R-L)/2);
if(nums[mid]<target)
{
L=mid+1;
}
else if(nums[mid]>target)
{
R=mid;
}
else {
return mid;
}
}
return -1;
};
};
二.移除元素
class Solution {
public:
int removeElement(vector<int>& nums, int val) {
int fast=0;
int slow=0;
for(fast=0;fast<nums.size();fast++)
{
if(nums[fast]!=val)
{
nums[slow]=nums[fast];
slow++;
}
}
return slow;
}
};
三.有序数组的平方
class Solution {
public:
vector<int> sortedSquares(vector<int>& nums) {
vector<int> nums2(nums.size(),0);
int n=nums.size()-1;
for(int i=0,j=nums.size()-1;i<=j;)
{
if(nums[i]*nums[i]<nums[j]*nums[j])
{
nums2[n]=nums[j]*nums[j];
j--;
}
else
{
nums2[n]=nums[i]*nums[i];
i++;
}
n--;
}
return nums2;
}
};
学习时长:0.5h
学习感悟:
第一天的题不难,坚持!算法路漫漫,开发路漫漫,加油加油!