LeetCode 704 二分查找
思路:解法也简单明了,用二分查找的方式解决,需要注意的是题目已经将数组按找升序排好了,不需要自己再排一篇,但在其他题目中用二分查找方式需要注意排序
附上代码:
class Solution {
public:
int search(vector<int>& nums, int target) {
int left=0;
int right=nums.size()-1;
while(left<= right){
int middle=(left+right)/2;
if(nums[middle]>target){
right=middle-1;
}else if(nums[middle]<target){
left=middle+1;
}else{
return middle;
}
}
return -1;
}
};
最开始的时候我while跳转条件写的是 left != right ,答案错误了,之后发现是left == right 的时候也需要循环一次,比如数据为一个nums={5},target=5,显然left == right 有意义,还有这里我试过将right = middle - 1的-1和left = middle + 1的+1去掉,发现都超时了,这也是需要注意的点。
LeedCode 27 移除元素
1. 暴力解法
思路:两层for循环,第一个for循环遍历数组 ,第二个for循环更新数组。
class Solution {
public:
int removeElement(vector<int>& nums, int val) {
int length = nums.size();
for(int i=0;i<length;i++){
if(nums[i]==val){
for(int j=i+1;j<length;j++){
nums[j-1] = nums[j];
}
length--;//此时数组大小-1
i--;//此时下标i以后的数值都向前移动了一位,所以i也向前移动一位
}
}
return length;
}
};
时间复杂度:
空间复杂度:
开始我使用了一个n=length来标记最终数组长度,最后发现有点冗余,用length--也能替代,还有注意j的下标是从i+1开始,由后一位赋值前一位。也要注意到i--,因为i以后的数值都向前移动了一位,下一次要重新从i开始循环。
2.双指指针法
思路:用快慢指针,快指针遍历数组,慢指针更新数组。
class Solution {
public:
int removeElement(vector<int>& nums, int val) {
int length = nums.size();
int fast,slow;
for( fast=0,slow=0;fast<length;fast++){
if(nums[fast]!=val){
nums[slow]=nums[fast];
slow++;
}
}
return slow;
}
};
时间复杂度:
空间复杂度:
快慢指针的想法也比较简单了,这种方法在数组和链表里面很常见,要牢牢掌握。