704 二分查找
①在 target 大于中间值的时候,left 需要移动,left这时候得移动到middle+1,因为middle已经不需要判断了,直接跳过
②在 target 小于中间值的时候,right 移动的时候,middle不需要进行+1,因为在while循环的时候判断条件为 left < right,本身就不会比较right的值
③middle的计算方式 left + ((right - left) / 2),防止溢出。int 类型存储的最大值为2147483647,相加大于这个数后就会发生溢出
class Solution {
public:
int search(vector<int>& nums, int target) {
int left = 0;
int right = nums.size();
while(left < right)
{
int middle = left + ((right - left) / 2);
if(target < nums[middle])
{
right = middle;
}
else if(target > nums[middle])
{
left = middle + 1;
}
else{
return middle;
}
}
return -1;
}
};
27 移除元素
①防止越界访问,指针的定义,当数组元素进行移动的时候,可以使用 j-1的方式防止越界
②元素移动后,数组大小发生变化,size要变,当前指向val的遍历指针也要回退--,因为当前指向的元素发生了变化,需要再次判断,元素移动后会返回第一次for循环,这里i会再次++来访问改变后的元素
class Solution {
public:
int removeElement(vector<int>& nums, int val) {
int k = nums.size();
for (int i = 0;i < k; i++)
{
if(nums[i] == val)
{
for(int j = i + 1; j < k; j++)
{
nums[j-1] = nums[j];
}
k--;
i--;
}
}
return k;
}
};
977 有序数组的平方
vector容器的使用,sort函数的使用方法
class Solution {
public:
vector<int> sortedSquares(vector<int>& nums) {
for (int i = 0; i < nums.size() ; i++)
{
nums[i] *= nums[i];
}
std::sort(nums.begin(), nums.end());
return nums;
}
};