704.二分查找
題目鏈接:704. 二分查找 - 力扣(LeetCode)?
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;int left=0;int right=nums.size()-1;while(left<=right){int middle=(right+left)/2;if(target<nums[middle]){right=middle-1;}else if(target>nums[middle]){left=middle+1;}else return middle;}return -1;}
};
27.移除元素
題目鏈接:27. 移除元素 - 力扣(LeetCode)
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--;size--;}}return size;}
};
這里的i--是因為比如現在是
【0,1,2,2,3】要刪的元素是2
? ? ? ? ? i? ?在指向2的位置,把后面的元素往前移,數組變成
【0,1,2,3】
? ? ? ? ? i? ?在指向后一個2的位置,如果不i--從1開始的話,就會直接往后遍歷i++,漏掉2
所以要i--;
size--當然就是移動一次就少一個元素,所以size要--;
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];}}return slow;}
};
雙指針感覺就是用fast指針來遍歷數組,用slow?指針來更新數組,最后slow指針指向的是更新后的數組。
977.有序數組的平方
題目鏈接:977. 有序數組的平方 - 力扣(LeetCode)
class Solution {//暴力解法
public:vector<int> sortedSquares(vector<int>& nums) {for(int i=0;i<nums.size();i++){nums[i]*=nums[i];}sort(nums.begin(),nums.end());return nums;}
};
class Solution {//雙指針解法
public:vector<int> sortedSquares(vector<int>& nums) {vector<int> result(nums.size(),0);int k=nums.size()-1;for(int i=0,j=nums.size()-1;i<=j;){if(nums[i]*nums[i]<nums[j]*nums[j]){result[k--]=nums[j]*nums[j];j--;}else{result[k--]=nums[i]*nums[i];i++;}}return result;}
};
感覺雙指針方法就是用i從前往后遍歷數組,j是從后往前遍歷數組,把大的賦值給新的數組