前言: 第一次用leetcode刷题,格式有点不适应,之前都是acm模式,需要熟悉熟悉
Leetcode 704 二分查找
题目链接704 二分查找
解题思路:本题目只运用二分法(原理:不断分段查找区间内的值),没有别的坑。
但是要注意几个点,要注意使用二分法的前提,其次就是目标区间的左闭右闭和左闭右开的两种常见情况:
左闭右闭:
while(right>=left){//[left,right]区间合法
if(target<nums[mid]){//区间的点是否重叠
right = mid - 1;
}
}
左闭右开:
while(right>left){//[left,right)区间合法
if(target<nums[mid]){//区间的点是否重叠
right = mid ;
}
}
还要注意数组默认是从零开始的
OK,下面放代码:
class Solution {
public:
int search(vector<int>& nums, int target) {
int left = 0;
int right = nums.size() - 1;
while (left <= right) {
int mid = (left + right)/2;
if (nums[mid] > target) {
right = mid - 1;
} else if (nums[mid] < target) {
left = mid + 1;
}
if(nums[mid] == target){
return mid;
}
}
return -1;
}
};
Leetcode 27 移除元素
题目链接27 移除元素
本题有多个解法:
这里写两个比较常见的
第一个就是暴力:
class Solution {
public:
int removeElement(vector<int>& nums, int val) {
//两个简单的循环嵌套;元素少一个,数组统一往前移动一位,数组长度减少一;
int long1 = nums.size();
for(int i=0;i<long1;i++){
if(nums[i] == val){
for(int j=i+1;j<long1;j++){
nums[j-1] = nums[j];
}
i--;
long1--;
}
}
return long1;
}
};
下面是双指针法(更小的时间复杂度)
class Solution {
public:
int removeElement(vector<int>& nums, int val) {
int slow = 0;//慢指针
for(int fast = 0;fast < nums.size();fast++){//快指针,这里说明快指针已经多走一步了
if(val != nums[fast]){//如果快指针所指的元素和目标数不相同
nums[slow] = nums[fast];//将快指针中的值赋给慢指针
slow++;//所求数据加一;
}
}
return slow;
}
};
//还需多理解一下
endl endl endl ;