704. 二分查找
题目链接:704. 二分查找
具体实现(C++):
class Solution {
public:
int search(vector<int>& nums, int target) {
int result = 0;
int left = 0, right = nums.size();
while(left < right){
if(target == nums[(left+right)/2] ){
return (left+right)/2;
}
else if(target < nums[(left+right)/2]){
right = (left+right)/2;
}
else{
left = (left+right)/2 + 1;
}
}
return -1;
}
};
时间复杂度:O(log n)
空间复杂度:O(1)
总结
- 注意审题。满足下面两点适合考虑二分法。
- 题目中是否为有序数组。
- 数组中是否有重复元素。
- 实现过程。
- 自己做的时候只是先定了左右边界的值,然后通过举例子带入的方式思考满足条件的表达式。一开始并没有选择区间的概念(左闭右开还是左闭右闭),很容易混乱。
- 主要问题就是循环起来后没有始终坚持根据查找区间的定义来做边界处理。
27. 移除元素
题目链接:27. 移除元素
标准实现(C++):
class Solution {
public:
int removeElement(vector<int>& nums, int val) {
int slow = 0,fast = 0;
while(fast < nums.size()){
if(nums[fast] != val){
nums[slow] = nums[fast];
slow++;
}
fast++;
}
return slow;
}
};
时间复杂度:O(n)
空间复杂度:O(1)
快慢指针:通过一个快指针和慢指针在一个for循环下完成两个for循环的工作。
- 定义快慢指针
- 快指针:寻找新数组的元素 ,新数组就是不含有目标元素的数组
- 慢指针:指向更新 新数组下标的位置
我的实现(C++):
class Solution {
public:
int removeElement(vector<int>& nums, int val) {
// 定义一个指向最后一个不为val的数组指针last
// 定义一个index指针从头开始循环遍历,每个循环中
// 先判断last内容是否为val,是则last--;continue;
// 然后判断若index所指内容为val,是则与last内容交换。
int index = 0,last = nums.size()-1;
while(index <= last){
if(nums[last] == val){
last--;
continue;
}
if(nums[index] == val){
int temp = nums[index];
nums[index] = nums[last];
nums[last] = temp;
// nums[index] = nums[last]; 直接覆盖好像也行
// last--;
}
index++;
}
return last + 1; //这里卡了半天,因为没+1,这里要输出的是数组的长度而不是最后一个下标
}
};
总结
-
审题。当题目中需要修改数组元素时,考虑多指针。
-
实现过程。其实已经见过一次了,但第一反应还是按照自己想法来根本没想到什么快慢指针,很乱没有章法0.0