704 二分查找
知识理论
(1) 使用C++的话,要注意vector 和 array的区别,vector的底层实现是array,严格来讲vector是容器,不是数组。
(2) C++中二维数组在地址空间上是连续的。
(3) int型占据4个字节。
二分查找法前提条件:
- 有序数组
- 无重复元素
注:
写二分法,区间的定义一般为两种,左闭右闭即[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) {
//内容
}
刷题的时候的思路:
- 其实之前有刷过,但是这次刷的时候还是没回想起来;
- 下次再刷做过的类型题的时候,还是要自己努力想一下,不会写代码,起码要想一下代码思路吖!
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即为新数组的长度
}
};