leetcode 颜色分类_leetcode难度

leetcode 颜色分类_leetcode难度给定一个包含红色、白色和蓝色,一共 n 个元素的数组,原地对它们进行排序,使得相同颜色的元素相邻,并按照红色、白色、蓝色顺序排列。此题中,我们使用整数 0、 1 和 2 分别表示红色、白色和蓝色。示例 1:输入:nums = [2,0,2,1,1,0]输出:[0,0,1,1,2,2]示例 2:输入:nums = [2,0,1]输出:[0,1,2]示例 3:输入:nums = [0]输出:[0]示例 4:输入:nums = [1]输出:[1] 提示:n == num

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全系列IDE使用 1年只要46元 售后保障 童叟无欺

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

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

示例 1:

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

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

输入:nums = [0]
输出:[0]
示例 4:

输入:nums = [1]
输出:[1]
 

提示:

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

进阶:

你可以不使用代码库中的排序函数来解决这道题吗?
你能想出一个仅使用常数空间的一趟扫描算法吗?

题解

  1. 快排
class Solution { 
   
public:
    void quick(int l,int r,vector<int>& nums){ 
   
        if(l < r){ 
   
            int mid = partion(l,r,nums);
            quick(l,mid - 1,nums);
            quick(mid + 1,r,nums);
        }
    }
    int partion(int l,int r,vector<int>&nums){ 
   
        int key = nums[l];
        while(l < r){ 
   
            while(l < r && nums[r] > key)r --;
            if(l < r)nums[l ++] = nums[r];
            while(l < r && nums[l] < key)l ++;
            if(l < r)nums[r --] = nums[l];
        }
        nums[l] = key;
        return l;
    }
    void sortColors(vector<int>& nums) { 
   
        int l = 0,r = nums.size() - 1;
        quick(l,r,nums);
    }
};
  1. 因为只有3组数字,最左边有一组,最右边有一组,中间有一组,所以把最左边和最右边都规整后,中间自然就规整,所以设置i,j代表左边放置0的下边,j为右边放置2的下标.

时间复杂度O(n)

class Solution { 
   
public:
    void sortColors(vector<int>& nums) { 
   
        int i = 0,n = nums.size(),j = nums.size() - 1;
        while(i < n && nums[i] == 0)i ++;
        while(j >= 0 && nums[j] == 2)j --;
        for(int k = i;k <= j;k ++){ 
   
            if(nums[k] == 0)swap(nums[i],nums[k]),i ++;
            else if(nums[k] == 2)swap(nums[j],nums[k]),k --,j --;   //注意当从后面换回去的时候可能回把后面的0换到前面
        }
    }
};
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/168874.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • n皇后问题c语言代码_求n的阶乘java代码

    n皇后问题c语言代码_求n的阶乘java代码问题描述:有一个n*n的棋盘,在这个棋盘中放n个皇后,使得这n个皇后,任意两个皇后不在同一行,同一列,同一条对角线。例如,当n等于4时,有两种摆法。输入只有一个整数n。思路如果我们是从这个n*n这个棋盘中选取n个方格放皇后,再去判断是否满足条件的话,则效率会非常低,这是一个组合数∁\complement∁nn∗nn\atopn*nn∗nn​,当n等于8时,就要枚举54502232次…

    2022年9月30日
    3
  • ai创意插件合集Astute Graphics

    ai创意插件合集Astute GraphicsAstutegraphics是一个AdobeIllustrator的创意插件合集,包含多种常见辅助功能,可以帮你提升平面与矢量设计的效率,AstuteGraphics最新版本也与时俱进的更新了支持CC2017的全系列插件,包含ColliderScribe,DynamicSketch,InkQuest,InkScribe,MirrorMe,Phantasm,Rasterino,VectorScribe,WidthScribe几大插件,插件支持Illustratorcs4/cs5/

    2022年5月30日
    55
  • gerrit用法

    gerrit用法

    2021年6月19日
    145
  • 中国电信DNS大全

    中国电信DNS大全中国电信辽宁省沈阳市DNS59.46.69.66中国电信辽宁省大连市DNS59.44.126.20中国电信青海省西宁市DNS202.100.138.68中国电信新疆乌鲁木齐市DNS61.128.114.133中国电信新疆乌鲁木齐市DNS61.128.114.166中国电信新疆乌鲁木齐市DNS61.128.114.85中国电信新疆乌鲁木齐市DNS61.128.114.70中国电信新疆乌鲁木齐市DNS61.128.99.133中国.

    2022年7月27日
    34
  • java中遍历数组_java循环取数组值

    java中遍历数组_java循环取数组值第一种方法(传统方法)inta[]={1,2,3,4,5};for(inti=0;i<a.length;i++){System.out.println(a[i]);}第二种方法(非传统方法)inta[]={1,2,3,4,5};for(inti:a){System.out.println(i);}注意:其中i的数据类型要和数组a的数组类型保持一致。第三种方…

    2026年1月22日
    6
  • http://www.msftconnecttest.com/redirect找不到应用程序解决办法

    我在连学校内网的时候,不能自动跳转到登录的页面,因为有一些默认的配置已经被修改。可能有的人认为不是自己修改的,那么原因也有可能是软件安装的过程中默认设置被修改,也有可能是你不轻易间点错了。不废话了,直接发图:第一步:window10:点击左下角的window图标—-找到设置—-点击默认设置第二步:往下拉,找到浏览器的默认设置,点击重置,ok…

    2022年4月6日
    3.3K

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号