代码随想录算法训练营第一天| 704. 二分查找、27. 移除元素
二分查找
第一眼没思路,原因担心除以2之后有小数,int会直接取整数
nums.size():C++中size()函数除了跟length()函数一样可以获取字符串长度之外,还可以获取vector类型的长度。
使用while去循环找target
没有写return -1,
需要+1或者-1,不然会陷入死循环。
二分法复杂度O(logn)
return vector{lbegin,rend};用于返回两个数
总结:有序数组,找一个数。
移除元素
变形:移除val,有序数组除去相同值,把一个数移动到末尾,比较含有退格的字符串,
平方排序暴力O(nlogn)
暴力解法
忘记写return
只有快指针不等的时候慢指针++;
class Solution {
public:
int removeElement(vector<int>& nums, int val) {
int size = nums.size();
for (int i = 0; i < size; i++) {
if (nums[i] == val) { // 发现需要移除的元素,就将数组集体向前移动一位
for (int j = i + 1; j < size; j++) {
nums[j - 1] = nums[j];
}
i--; // 因为下标i以后的数值都向前移动了一位,所以i也向前移动一位
size--; // 此时数组的大小-1
}
}
return size;
}
};
双指针法
int size = nums.size();
int left = 0;
int right = 0;
for(right=0;right<nums.size();right++ )
{
// left++;
if(nums[right]!=val)
{
nums[left] = nums[right];
left++;
}
}
return left;
还有一种减少改动但是改变顺序的方法
int left = 0;
int right = nums.size();
while(left < right)
{
if(nums[left] == val)
{
nums[left] = nums[right-1];//一定是减一因为要判断右面的是不是
--right;
}else{
++left;//只有不为val的时候才++
}
}
return right;