1.704二分查找
二分查找题目https://leetcode.cn/problems/binary-search/二分法视频链接https://www.bilibili.com/video/BV1fA4y1o715/
思路:第一想到使用暴力求解,遍历数组寻找相同元素输出下标;
class Solution {
public:
int search(vector<int>& nums, int target) {
for(int i=0;i<nums.size();i++)
{
if(nums[i]==target)
{
return i;
}
}
return -1;
}
};
二分法学习(前提是数组是有序数组,这也是使用二分查找的基础条件):
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)
{
return mid;
}
else if(nums[mid]<target)
{
left=mid;
}
else if(nums[mid]>target)
{
right=mid;
}
}
return -1;
}
};
超出了时间限制,left=mid+1;right=mid-1才可以保证时间,不过用时更长了QAQ;
以上为左闭右闭,左闭右开的情况需要while(left<right);同时向左移动right时,也应该放弃mid-1,而是right=mid,防止right=left情况
2. 27移除元素
思路:第一想到使用暴力求解,遍历数组寻找相同元素,然后删除掉,再输出长度,但是找不到合适的函数,所以使用再加一个for循环;
class Solution {
public:
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--; // 因为下标i以后的数值都向前移动了一位,所以i也向前移动一位
size--;
}
}
return size;
}
};
但是不满足复杂度要求,学习双指针法:
class Solution {
public:
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;
}
};
int leftIndex = 0;
int rightIndex = nums.size() - 1;
while (leftIndex <= rightIndex) {
while (leftIndex <= rightIndex && nums[leftIndex] != val){
++leftIndex;
}
while (leftIndex <= rightIndex && nums[rightIndex] == val) {
-- rightIndex;
}
if (leftIndex < rightIndex) {
nums[leftIndex++] = nums[rightIndex--];
}
}
return leftIndex;
}
.双指针法会将后面的元素赋值到前面,但是移动最少元素