-
二分查找
35题
class Solution {
public:
int searchInsert(vector<int>& nums, int target) {
int left = 0;
int right = nums.size()-1;
while(left<= right){
int middle = left+((right-left)>>1);
if(target>nums[middle]){
left = middle+1;
}
else if(target<nums[middle]){
right = middle-1;
}
else
return middle;
}
return left;
}
};
34题
class Solution {
public:
vector<int> searchRange(vector<int>& nums, int target) {
vector<int> result = GetBoard(nums, target);
if(result[0]==-2||result[1]==-2)
return {-1,-1};
if (result[1] - result[0] > 1)
return {result[0] + 1, result[1] - 1};
return {-1, -1};
}
private:
vector<int> GetBoard(vector<int>& nums, int target) {
vector<int> result = {-2, -2};
int right = nums.size() - 1;
int left = 0;
while (left <= right) {
int middle = left + ((right - left) >> 1);
if (nums[middle] >= target) {
right = middle - 1;
result[0] = right;
} else if (nums[middle] < target) {
left = middle + 1;
}
}
right = nums.size() - 1;
left = 0;
while (left <= right) {
int middle = left + ((right - left) >> 1);
if (nums[middle] > target) {
right = middle - 1;
} else if (nums[middle] <= target) {
left = middle + 1;
result[1] = left;
}
}
return result;
}
};
69题 注意这里的mid需设置成 long long ,因为mid*mid的返回类型默认与mid一致,但是无需把x设为long long
class Solution {
public:
int mySqrt(int x) {
if (x < 1)
return 0;
int left = 1, right = x;
while (left < right) {
long long mid = left + (right - left + 1) / 2;
if (mid * mid <= x)
left = mid;
else
right = mid - 1;
}
return left;
}
};
367题
class Solution {
public:
bool isPerfectSquare(int num) {
int left=0;
int right = num;
while(left<=right){
long double middle=left+((right-left)>>2);
if(middle*middle>num){
right=middle-1;
}else if(middle*middle<num){
left=middle+1;
}else{
long long mid =middle;
if(mid*mid==num)
return true;
}
}
return false;
}
};
-
移除元素
26题 前后都容易溢出,需要小心!
class Solution {
public:
int removeDuplicates(vector<int>& nums) {
int fast = 0;
int slow = 0;
for (fast = 0; fast < nums.size() - 1; fast++) {
if (nums[fast] != nums[fast + 1])
nums[slow++] = nums[fast];
}
if (nums[fast] != nums[slow]) {
nums[slow++] = nums[fast];
} else {
nums[slow++] = nums[fast];
return slow;
}
return slow;
}
};
283题
class Solution {
public:
void moveZeroes(vector<int>& nums) {
int fast=0;
int slow =0;
int count=0;
int size=nums.size();
for(fast=0;fast<size;fast++){
if(nums[fast]!=0){
nums[slow++]=nums[fast];
}else
{count++;
}
}
for(int i=0;i<count;i++){
nums[size-1-i]=0;
}
}
};
844题 注意指针传参
class Solution {
public:
bool backspaceCompare(string s, string t) {
int l = 0;
int l_1 = 0;
s = Back_delete(s, &l);
t = Back_delete(t, &l_1);
// cout << s << '\n' << t;
// cout << l << l_1;
if (l != l_1)
return false;
for (int j = 0; j < l; j++) {
if (s[j] != t[j]) {
return false;
}
}
return true;
}
private:
string Back_delete(string s, int* l) {
int fast = 0;
int slow = 0;
int count = 0;
int size = s.length();
for (fast = 0; fast < size; fast++) {
if (s[fast] != '#') {
s[slow++] = s[fast];
}
else {
if (slow > 0)
slow--;
count++;
// if (fast == size) {
// s[slow] = '0';
// }
}
}
// for (int i = 0; i < 2 * count; i++) {
// s[size - 1 - i] = '0';
// }
*l = slow;
return s;
}
};
977题 前后双指针 注意vector初始化是 名(size,0),不是 名=(size,0)
class Solution {
public:
vector<int> sortedSquares(vector<int>& nums) {
vector<int> result(nums.size(),0);
int j = nums.size()-1;
int k = nums.size()-1;
for(int i=0;i<=j;){
if(nums[j]*nums[j]>nums[i]*nums[i]){
result[k--]=nums[j]*nums[j];
j--;
}else{
result[k--]=nums[i]*nums[i];
i++;
}
}
return result;
}
};