立志重刷代码随想录60天冲冲冲!!——第一周查缺补漏
(周末补更)
34. 在排序数组中查找元素的第一个和最后一个位置
第一个target:简单二分,然后target == nums[mid]时,再次添加right = mid - 1
最后一个target:还是简单二分,然后target == nums[mid]时,再次添加left = mid + 1
class Solution {
public:
vector<int> searchRange(vector<int>& nums, int target) {
int len = nums.size();
int first = -1, last = -1;
// 寻找第一个target
int left = 0;
int right = len - 1;
while (left <= right) {
int mid = (left + right) / 2;
if (target < nums[mid]) {
right = mid - 1;
} else if (target > nums[mid]){
left = mid + 1;
} else {
// 若target == nums[mid],right = mid - 1;
right = mid - 1;
first = mid;
}
}
// 寻找第一个target
left = 0;
right = len - 1;
while (left <= right) {
int mid = (left + right) / 2;
if (target < nums[mid]) {
right = mid - 1;
} else if (target > nums[mid]){
left = mid + 1;
} else {
// 若target == nums[mid],left = mid + 1;
left = mid + 1;
last = mid;
}
}
return {first, last};
}
};
(拓展练习)
69. x 的平方根
class Solution {
public:
int mySqrt(int x) {
int left = 0;
int right = x;
int ans = -1; // 记录答案
while (left <= right) {
int mid = (left + right) / 2;
// 有可能内存泄漏,需定义long long
if ((long long)mid * mid > x) {
right = mid - 1;
} else {
ans = mid;
left = mid + 1;
}
}
return ans;
}
};
367. 有效的完全平方数
若right = num; 可以省略num == 1的情况;
class Solution {
public:
bool isPerfectSquare(int num) {
if (num == 1) {return true;} // 若right = num; 可以省略此行;
int left = 0, right = num - 1;
while (left <= right) {
int mid = (left + right) / 2;
if ((long long)mid * mid < num) {
left = mid + 1;
} else if ((long long)mid * mid > num) {
right = mid - 1;
} else {
return true;
}
}
return false;
}
};
26. 删除有序数组中的重复项
相当不熟练,要想清楚快慢指针含义,分别处理快慢指针进位。
class Solution {
public:
int removeDuplicates(vector<int>& nums) {
int len = nums.size();
if (len == 1) {return len;}
int slow = 1, fast = 1;
while (fast < len) {
// 慢指针表示位置,快指针表示数值(无论如何都要向前走)
// 快指针与前一格不同,就把快指针赋值给慢指针,慢指针++
if (nums[fast] != nums[fast - 1]) {
nums[slow] = nums[fast];
slow++;
}
fast++;
}
return slow;
}
};
283. 移动零
有了上一题双指针思路,这个秒
class Solution {
public:
void moveZeroes(vector<int>& nums) {
int len = nums.size();
int slow = 0, fast = 0;
// 慢指针是位置,快指针是数值(快指针需不停向前)
// 快指针指向0,快慢指针交换,慢指针++
while (fast < len) {
if (nums[fast] != 0) {
swap(nums[slow], nums[fast]);;
slow++;
}
fast++;
}
}
};
代码随想录更新 文章被收录于专栏
冲冲冲冲冲冲!
途虎成长空间 159人发布
