Leetcode 704 二分查找
题目链接:
思路:
二分查找这道题目本人已经刷第二遍了,今天再看到这道题目的时候还能记住解题思路:首先是区间的定义作为不变量,在二分查找的整个过程中必须保持 区间的定义 不变!区间的定义有两种:左闭右闭 和 左闭右开。其次是循环的条件:因为我选择的是左闭右闭区间,因此,循环的条件中可以取“=”号,其原因是为了保持区间定义的不变量。最后是区间的更新:原则就是 已经查找过的元素值不要重复进行查找比较。
本人题解:
class Solution {
public:
int search(vector<int>& nums, int target) {
int left = 0;
int right = nums.size() - 1;
//如果用的是左闭右闭区间的话,需要减去1,因为下标从0开始
while (left <= right) {
int mid = (left + right)/2;
if (target > nums[mid]) {
left = mid + 1;
continue;
}
else if (target < nums[mid]) {
right = mid - 1;
continue;
}
else {
return mid;
}
}
return -1;
}
};
时间复杂度: O(logn)
Leetcode 27 移除元素
题目链接:
思路:
这道题我也能勉强记住思路自己刷。看到题目就想到了用快慢双指针法,需要注意的细节如下:快指针用于筛选符合新的数组的元素,而慢指针用于保存新的数组的元素;慢指针的大小其实就是新的数组的大小。
本人题解:
class Solution {
public:
int removeElement(vector<int>& nums, int val) {
//这道题目是采用的典型的快慢双指针法
//一般快指针用于搜索符合新集合的元素,并用慢指针进行存储
int slow = 0;
int fast = 0;
int n = nums.size();
for (; fast < n; fast++) {
if (nums[fast] == val) continue;
nums[slow] = nums[fast];
//将快指针搜索到的符合新集合要求的值赋给慢指针进行保存
slow++;
}
return slow;//slow的值其实就是新的数组的长度
}
};
时间复杂度:O(n)
今日用时
自己凭印象刷题花费:20分钟
刷题后再看一遍代码随想录花费:30分钟