当前位置: 首页 > news >正文

LeetCode 热题 100_颜色分类(98_75_中等_C++)(技巧)(计数;双指针)

LeetCode 热题 100_颜色分类(98_75_中等_C++)

    • 题目描述:
    • 输入输出样例:
    • 题解:
      • 解题思路:
        • 思路一(计数):
        • 思路二(双指针):
      • 代码实现
        • 代码实现(思路一(计数)):
        • 代码实现(思路二(双指针)):
        • 以思路一为例进行调试

题目描述:

给定一个包含红色、白色和蓝色、共 n 个元素的数组 nums ,原地 对它们进行排序,使得相同颜色的元素相邻,并按照红色、白色、蓝色顺序排列。

我们使用整数 0、 1 和 2 分别表示红色、白色和蓝色。

必须在不使用库内置的 sort 函数的情况下解决这个问题。

输入输出样例:

示例 1:
输入:nums = [2,0,2,1,1,0]
输出:[0,0,1,1,2,2]

示例 2:
输入:nums = [2,0,1]
输出:[0,1,2]

提示:
n == nums.length
1 <= n <= 300
nums[i] 为 0、1 或 2

题解:

解题思路:

思路一(计数):

1、分别对红、白、蓝进行计数,再对数组进行更改。

2、复杂度分析:
① 时间复杂度:O(n),n为数组中元素的个数,计数时遍历一遍数组,更改时遍历一遍数组。
② 空间复杂度:O(1)。

思路二(双指针):

1、具体思想:从左往右遍历数组,如果为0则放到左边,如果为2则放到右边。因在原数组进行变换所以使用swap。

  • 使用left指针来标记所有0的区域。
  • 使用right指针来标记所有2的区域。
  • current指针遍历整个数组,将0、1、2放到正确的位置。

2、复杂度分析:
① 时间复杂度:O(n),n为数组中元素的个数,遍历一遍数组。
② 空间复杂度:O(1)。

代码实现

代码实现(思路一(计数)):
class Solution1 {
public:// sortColors函数:排序颜色问题,使用计数排序的方式void sortColors(vector<int> &nums) {int red = 0, white = 0;  // red记录0的个数,white记录1的个数// 遍历nums数组,统计0和1的个数for(int &i : nums) {if (i == 0) {  // 如果当前元素是0,增加red计数red++;} else if (i == 1) {  // 如果当前元素是1,增加white计数white++;}}// 计算white的正确索引位置white = red + white;  // white是1的最后一个位置的索引+1// 将数组中前red个元素设置为0for (int i = 0; i < red; i++) {nums[i] = 0;}// 将数组中red到white-1的元素设置为1for (int i = red; i < white; i++) {nums[i] = 1;    }// 将数组中从white开始的位置设置为2for (int i = white; i < nums.size(); i++) {nums[i] = 2;    }}
};
代码实现(思路二(双指针)):
class Solution2 {
public:void sortColors(vector<int>& nums) {int left = 0, right = nums.size() - 1, current = 0;// 使用三指针,分别控制0、1、2的位置while (current <= right) {if (nums[current] == 0) {// 0的情况,交换当前元素和left位置的元素swap(nums[left], nums[current]);left++;current++;} else if (nums[current] == 1) {// 1的情况,直接移动current指针current++;} else {// 2的情况,交换当前元素和right位置的元素swap(nums[current], nums[right]);right--;}}}
};
以思路一为例进行调试
#include<iostream>
#include<vector>
using namespace std;class Solution2 {
public:void sortColors(vector<int>& nums) {int left = 0, right = nums.size() - 1, current = 0;// 使用三指针,分别控制0、1、2的位置while (current <= right) {if (nums[current] == 0) {// 0的情况,交换当前元素和left位置的元素swap(nums[left], nums[current]);left++;current++;} else if (nums[current] == 1) {// 1的情况,直接移动current指针current++;} else {// 2的情况,交换当前元素和right位置的元素swap(nums[current], nums[right]);right--;}}}
};int main(int argc, char const *argv[])
{vector<int> nums={2,0,2,1,1,0};Solution2 s;s.sortColors(nums);for (int i = 0; i < nums.size(); i++){cout<<nums[i]<<" ";}return 0;
}

LeetCode 热题 100_颜色分类(98_75)原题链接
欢迎大家和我沟通交流(✿◠‿◠)

相关文章:

  • Shell和Bash介绍
  • 学习threejs,使用Physijs物理引擎,通过控制重力,实现多米诺骨牌效果
  • Data Mining|缺省值补全实验
  • 【PmHub后端篇】PmHub集成 Sentinel+OpenFeign实现网关流量控制与服务降级
  • 【拥抱AI】Deer-Flow字节跳动开源的多智能体深度研究框架
  • More Effective C++:改善编程与设计(上)
  • java连数据库
  • AI-02a5a5.神经网络-与学习相关的技巧-权重初始值
  • 汽车免拆诊断案例 | 2015款路虎极光车组合仪表提示“充电系统故障”
  • 团结引擎开源车模 Sample 发布:光照渲染优化 动态交互全面体验升级
  • YOLO v1:目标检测领域的革命性突破
  • 【优选算法 | 字符串】字符串模拟题精选:思维+实现解析
  • 人工智能驱动的临床路径体系化解决方案与实施路径
  • KUKA库卡焊接机器人智能气阀
  • 大模型微调实战:基于GpuGeek平台的低成本高效训练方案
  • MySQL 服务器配置和管理(上)
  • react+html2canvas+jspdf将页面导出pdf
  • AI规则引擎:解锁SQL数据分析新姿势
  • RBTree的模拟实现
  • 《P2345 [USACO04OPEN] MooFest G》
  • 男子入户强奸高龄独居妇女致其死亡,法院:属实,已执行死刑
  • 上海北外滩,未来五年将如何“长个子”“壮筋骨”?
  • 习近平同巴西总统卢拉共同会见记者
  • 沙县小吃中东首店在沙特首都利雅得开业,首天营业额超5万元
  • 新华时评:中美经贸会谈为全球经济纾压增信
  • 冷冰川谈黑白