代码随想录算法训练营day01|704. 二分查找,27. 移除元素,977.有序数组的平方

704. 二分查找

题目链接:https://leetcode.cn/problems/binary-search/description/

我的代码:

class Solution
{
public:
int search(vector<int> &nums, int target)
{
int low = 0, high = nums.size() - 1; // 此处分情况讨论
return searchTarget(nums, low, high, target);
}
int searchTarget(vector<int> &nums, int low, int high, int target)
{
while (high >= low)
{ // 此处分情况讨论
int mid = (low + high) / 2; // 可作差除以二后加较小数防止溢出
if (nums[mid] == target)
{
return mid;
}
if (nums[mid] > target)
{
high = mid - 1;
} // 此处分情况讨论
if (nums[mid] < target)
{
low = mid + 1;
} // 此处分情况讨论
}
return -1;
}
};

本题左闭右闭区间,另有左闭右开等情况,分情况讨论。

27. 移除元素

题目链接:https://leetcode.cn/problems/remove-element/description/

我的代码(暴力解法):

class Solution {
public:
int removeElement(vector<int>& nums, int val) {
int k = 0, n = nums.size();
for (int i = 0; i < n; i++) {
if (nums[i] == val) {
for (int j = i; j < n - 1; j++) {
nums[j] = nums[j + 1];
}
i--;
n--;
} else
k++;
}
return k;
}
};

将不含val的数组元素依次向前移动形成新数组。

双指针解法(快慢指针):

class Solution {
public:
int removeElement(vector<int>& nums, int val) {
int slow = 0;
for (int fast = 0; fast < nums.size(); fast++) {
if (nums[fast] != val) {
nums[slow++] = nums[fast];
}
}
return slow;
}
};

快指针:依次向后寻找不含val的新数组元素。
慢指针:记录新数组的下标。

977.有序数组的平方

题目链接:https://leetcode.cn/problems/squares-of-a-sorted-array/

我的代码(暴力解法):

class Solution {
public:
vector<int> sortedSquares(vector<int>& nums) {
for (int i = 0; i < nums.size(); i++) {
nums[i] = nums[i] * nums[i];
}
for (int i = 0; i < nums.size() - 1; i++) {
for (int j = 0; j < nums.size() - i - 1; j++) {
if (nums[j] > nums[j + 1]) {
int temp = nums[j + 1];
nums[j + 1] = nums[j];
nums[j] = temp;
}
}
}
return nums;
}
};

先平方再冒泡排序。

双指针解法(左右指针):

class Solution {
public:
vector<int> sortedSquares(vector<int>& nums) {
vector<int> result(nums.size(), 0);
int i = 0;
int j = nums.size() - 1;
int k = nums.size() - 1;
while (i <= j) {
if (nums[i] * nums[i] >= nums[j] * nums[j]) {
result[k--] = nums[i] * nums[i];
i++;
} else {
result[k--] = nums[j] * nums[j];
j--;
}
}
return result;
}
};

左右指针都向中间移动,较大的放入数组末端直到两指针相遇。

posted @   kurumaruq  阅读(63)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· PowerShell开发游戏 · 打蜜蜂
· 在鹅厂做java开发是什么体验
· 百万级群聊的设计实践
· WPF到Web的无缝过渡:英雄联盟客户端的OpenSilver迁移实战
· 永远不要相信用户的输入:从 SQL 注入攻防看输入验证的重要性
点击右上角即可分享
微信分享提示