相关链接:
704.二分查找
我自己的思路是先确定循环的最大次数,然后一遍一遍进行二分查找,最终执行通过的代码如下
int search(vector<int>& nums, int target){
int max = nums.size();
int min = 0;
for (int i = 0; i <= nums.size()/2; ++i) {
int j = (min + max) / 2;
if (nums[j] == target) {
return j;
}
else if (nums[j] > target) {
max = j;
}
else {
min = j + 1;
}
}
return -1;
}
在参考了代码随想录的题解后,发现我的代码循环次数会多一次,因为要通过 [5] 5的测试样例,我直接把循环处改成了 i<=nums.size(),并且发现其实我的做法就是左闭右开的思路,同时也学习到了左闭右闭的思路。
int search(vector<int>& nums, int target) {
int left = 0;
int right = nums.size(); // 定义target在左闭右开的区间里
while (left < right) {
int middle = left + ((right - left) /2);
if (nums[middle] > target) {
right = middle;
}
else if (nums[middle] < target) {
left = middle + 1;
}
else {
return middle;
}
}
return -1;
}
27.移除元素
用暴力解法可以直接通过该题目,这也是我只能想到的办法,直接遍历,用两层循环,时间复杂度为O(n2)代码如下
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;
--size;
}
}
return size;
}
用双指针法可以在时间复杂度O(n)的前提下解决该题目
设置一个快指针和一个慢指针,快指针用来寻找新数组的元素,慢指针用来指向要更新的新数组下标的位置。
对于这道题,我把它们理解为,当出现要删除的元素时,快指针说:“我先走一步,去给你找一个新的不用删除的元素放这儿。”慢指针说:“我先不动,等你找到新的元素,我把这个要删除的给替换了再动。”
代码实现如下
int removeElement(vector<int>& nums, int val) {
int slowIndex = 0;
for (int fastIndex = 0; fastIndex < nums.size(); fastIndex++) {
if (val != nums[fastIndex]) {
nums[slowIndex++] = nums[fastIndex];
}
}
return slowIndex;
}
总结:
今天学习到了二分查找的规范写法以及左闭右开,左闭右闭的不同思路。学习到了双指针法,这是我之前不会的方法,应当多加练习,做到熟能生巧