Day 1
二分
方式一:
target是在一个左闭右闭的区间,[left,right]
class Solution{
public:
int search(vector<int>& nums,int target){
int left=0,right=nums.size()-1;
while(left<=right){
int middle=left+((right-left)/2);
//防止溢出 等同于(left + right)/2
if(nums[middle] > target){
right=middle-1;
}else if(nums[middle]<target){
left=middle1;
}else
return middle;
}
return -1;
}
}
- 时间复杂度:O(log n)
- 空间复杂度:O(1)
方式二:
target是在一个左闭右开的区间,[left,right)
class Solution{
public:
int search(vector<int>& nums,int target){
int left=0,right=nums.size();
while(left<right){
int middle=left+((right-left)>>1);
if(nums[middle]>target) right=middle;
else if(nums[middle]<target) left=midlle+1;
else return middle;
}
return -1;
}
}
- 时间复杂度:O(log n)
- 空间复杂度:O(1)
704.二分
27.移除元素
暴力的解法,可以锻炼一下我们的代码实现能力,先把暴力写法写一遍。
class Solution {
public:
int removeElement(vector<int>& nums, int val) {
int count=0;
for(int i=0;i<nums.size();i++)
{
if(val==nums[i])
{
count++;
nums[i]=1e6;
}
}
sort(nums.begin(),nums.end());
return (nums.size()-count);
}
};
双指针法:借助两个快慢指针实现时间复杂度的优化
class Solution {
public:
int removeElement(vector<int>& nums, int val) {
int slowIndex=0,count=0;
for(int fastIndex=0;fastIndex<nums.size();fastIndex++)
{
if(nums[fastIndex]!=val)
{
nums[slowIndex++]=nums[fastIndex];
}
}
return slowIndex;
}
};
977.有序数组的平方
暴力解法:
class Solution {
public:
vector<int> sortedSquares(vector<int>& nums) {
for(int i=0;i<nums.size();i++)
{
nums[i]=pow(nums[i],2);
}
sort(nums.begin(),nums.end());
return nums;
}
};
时间复杂度是O(n+nlogn)
双指针法:
class Solution {
public:
vector<int> sortedSquares(vector<int>& nums) {
int k=nums.size()-1;
vector<int> result(nums.size(),0);
for(int i=0,j=nums.size()-1;i<=j;)
{
if(pow(nums[i],2)<pow(nums[j],2))
{
result[k]=pow(nums[j],2);
j--;
k--;
}
else
{
result[k]=pow(nums[i],2);
i++;
k--;
}
}
return result;
}
};