代码随想录算法训练营第一天| 704. 二分查找、27. 移除元素

704 二分查找

知识理论
(1) 使用C++的话,要注意vector 和 array的区别,vector的底层实现是array,严格来讲vector是容器,不是数组。
(2) C++中二维数组在地址空间上是连续的。
(3) int型占据4个字节。

二分查找法前提条件:

  1. 有序数组
  2. 无重复元素
    注:
    写二分法,区间的定义一般为两种,左闭右闭即[left, right],或者左闭右开即[left, right)。

易错点:
1.当左闭右闭区间时,初始化:

int left = 0;
int right= nums.size()-1;  //易错
while(left <= right) {
  //内容
}

2.当左闭右开时,初始化:

int left = 0;
int right= nums.size();  //易错,不是nums.size()-1
while(left < right) {
  //内容
}

刷题的时候的思路:

  1. 其实之前有刷过,但是这次刷的时候还是没回想起来;
  2. 下次再刷做过的类型题的时候,还是要自己努力想一下,不会写代码,起码要想一下代码思路吖!

27 移除元素

解题思路
1.for循环可以遍历整个数组;
2.这道题分为两种解法,一种是暴力法,一种是双指针法;
(1) 暴力法:时间复杂度是O(n^2)
具体思想:
先用第一层for循环遍历数组;
若发现有数值等于目标值,那么再来一层for循环,这层for循环里边,将后边的数值整体往前移动一格,代替掉原来目标值所在的位置。
(2)双指针法(重点)
分为:一个快指针 + 一个慢指针;
快指针用来寻找新数组中的元素,慢指针用来存储新数组中的元素。
如果是新数组的元素(非val值),将这个值存储到慢指针下边;存储完后,慢指针指向的位置要+1,为存储下一个新的数值做准备。
如果快指针发现数组元素不是新数组中的值(也即发现val值),那么慢指针不进行存储。

class Solution {
public:
    int removeElement(vector<int>& nums, int val) {
        
        //day01 2、双指针法
        int length = nums.size();
        int slowIndex = 0;
        for(int fastIndex = 0; fastIndex < length; fastIndex++) {
            if(val != nums[fastIndex]) {
                nums[slowIndex] = nums[fastIndex];
                slowIndex++;
                //或者if语句中的另一种写法: nums[slowIndex++] = nums[fastIndex];
            }
        }
        return slowIndex;
        //遍历完后,返回slow,由于if语句中slowIndex在最后进行了+1操作,
        //所以return语句中,slowIndex无需进行+1操作,返回的slowIndex即为新数组的长度
    } 
};
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值