目录
704. 二分查找
解决问题的关键在于搜索区间的定义。
左闭右闭解法
class Solution {
public:
int search(vector<int>& nums, int target) {
// 左闭右闭
int left = 0;
int right = nums.size() - 1;
while (left <= right) {
int middle = left + (right - left) / 2;
if (nums[middle] > target)
right = middle - 1;
else if (nums[middle] < target)
left = middle + 1;
else
return middle;
}
return -1;
}
};
左闭右开解法
class Solution {
public:
int search(vector<int>& nums, int target) {
// 左闭右开
int left = 0;
int right = nums.size();
while (left < right) {
int middle = left + (right - left) / 2;
if (nums[middle] > target)
right = middle;
else if (nums[middle] < target)
left = middle + 1;
else
return middle;
}
return -1;
}
};
27. 移除元素
题目链接:
暴力法
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];
}
size--;
i--;
}
}
return size;
}
};
双指针法
class Solution {
public:
int removeElement(vector<int>& nums, int val) {
int fast = 0; int slow = 0;
int size = nums.size();
for (; fast < nums.size(); fast++) {
if(nums[fast]!= val){
nums[slow++] = nums[fast];
}
else size--;
}
return size;
}
};
977. 有序数组的平方
题目链接:
暴力法
时间复杂度O(n + nlogn),遍历和快排。
class Solution {
public:
vector<int> sortedSquares(vector<int>& nums) {
for (int i = 0; i <= nums.size() - 1; i++) {
nums[i] *= nums[i];
}
sort(nums.begin(), nums.end());
return nums;
}
};
双指针法
题目给出的数组是升序的。对其元素平方后,其数据要不就中间小两头大(有负数),要不就还是升序。采用初始时一个指向起始位置、一个指向终止位置的双指针进行比较遍历,并把大者逆序存在result中就是答案了。
class Solution {
public:
vector<int> sortedSquares(vector<int>& nums) {
int k = nums.size() - 1;
int i = 0; int j = k;
vector<int> result(k + 1, 0);
while(i <= j) {
int iSquare = nums[i]*nums[i];
int jSquare = nums[j]*nums[j];
if (iSquare < jSquare){
result[k--] = jSquare;
j--;
}
else {
result[k--] = iSquare;
i++;
}
}
return result;
}
};
浙公网安备 33010602011771号