首页 > 其他分享 >LeetCode HOT 100:颜色分类(荷兰国旗问题)

LeetCode HOT 100:颜色分类(荷兰国旗问题)

时间:2022-12-21 16:13:42浏览次数:64  
标签:index nums int less HOT 100 指针 LeetCode more

题目:75. 颜色分类

题目描述:

给你一个数组,元素只为0、1、2,分别代表红色、白色和蓝色。将数组中相同颜色的元素移动到一起,并将它们排序。也就是将0都排在最前面,1排在中间,2排在最后。题目要求不申请额外空间,原地移动。

思路:

这道题的思路很清晰,就是荷兰国旗问题。用解荷兰国旗问题的方法解这道题就行。那么荷兰国旗问题如何解呢?设置两个指针,分别命名为lessmoreless指针代表[0...less]区域都是小于某个值的,more指针代表[more...数组长度 - 1]区域都是大于某个值的。这样,中间部分一定就是等于某个值的。最终就将数组划分为三块区域了。
那么指针该如何移动呢?如果当前遍历到的元素小于某个值,就将less++,然后将less和当前下标交换,如果大于某个值,就将more--,然后将more和当前下标交换,相等就接着遍历下一个,不用交换。一直遍历到more下标结束。因为more后面的元素都是大于某个值的了,所以不用再遍历了。

步骤:

1、设置lessmore指针并初始化
2、按照规则,移动两个指针,并元素交换
3、返回数组

代码:

    public void sortColors(int[] nums) {
        partition(nums, 0, nums.length - 1, 1);
    }

    // 将数组[L...R]范围,划分为 <val, =val, >val 三个区域
    public void partition(int[] nums, int L, int R, int val) {
        int less = L - 1;
        int more = R + 1;
        int index = L;

        while (index < more) {
            if (nums[index] == val) {
                index++;
            } else if (nums[index] < val) {
                less++;
                swap(nums, less, index);
                index++;
            } else {
                more--;
                swap(nums, index, more);
            }
        }
    }

    public void swap(int[] nums, int i, int j) {
        int temp = nums[i];
        nums[i] = nums[j];
        nums[j] = temp;
    }

标签:index,nums,int,less,HOT,100,指针,LeetCode,more
From: https://www.cnblogs.com/yuhang-wiki/p/16996423.html

相关文章

  • [leetcode]第 5 天 查找算法(中等)
    04.二维数组中的查找思路直接遍历!两个for循环classSolution{publicbooleanfindNumberIn2DArray(int[][]matrix,inttarget){for(int[]row:mat......
  • R7-3 求100以内的素数
    R7-3求100以内的素数分数 15全屏浏览题目切换布局作者 张高燕单位 浙大城市学院求100以内的全部素数,每行输出10个。素数就是只能被1和自......
  • LeetCode刷题笔记
    目录AlgorithmNote基础数组链表哈希表字符串栈与队列二叉树参考链接:代码随想录AlgorithmNote基础数组67:Sqrt-X二分查找法:x平方根的整数部分是ans是满足\(k^2......
  • leaflet利用hotline实现河流差值渲染热力图
    实现效果(这里做了1条主河道和5个支流):  核心代码使用了Leaflet.hotline插件,github下载地址链接详情见我之前整理的一篇文章介绍河流热力图核心代码逻辑://处理河流......
  • Ubuntu22.04 不能正常打开Flameshot 截图软件
    Ubuntu22.04安装Flameshot后通过命令 flameshotgui启动截图软件会打开下面的界面 而不是正常的Flameshot截图软件出现这个问题是Gnome的问题,详细说明在这里https:/......
  • #yyds干货盘点# LeetCode程序员面试金典:节点间通路
    题目:节点间通路。给定有向图,设计一个算法,找出两个节点之间是否存在一条路径。示例1:输入:n=3,graph=[[0,1],[0,2],[1,2],[1,2]],start=0,target=2输出:tr......
  • [LeetCode]009-回文数
    >>>传送门题目给你一个整数x,如果x是一个回文整数,返回true;否则,返回false。回文数是指正序(从左向右)和倒序(从右向左)读都是一样的整数。例如,121是回文,而123不......
  • leetcode-整数反转
    给你一个32位的有符号整数x,返回将x中的数字部分反转后的结果。如果反转后整数超过32位的有符号整数的范围 [−231, 231 −1],就返回0。假设环境不允许存储64......
  • ASEMI肖特基二极管SBT30100VFCT参数,SBT30100VFCT封装
    编辑-ZASEMI肖特基二极管SBT30100VFCT参数:型号:SBT30100VFCT最大重复峰值反向电压(VRRM):100V最大平均正向整流输出电流(IF):30A峰值正向浪涌电流(IFSM):250A每个元件的典型热......
  • ASEMI肖特基二极管SBT30100VFCT参数,SBT30100VFCT封装
    编辑-ZASEMI肖特基二极管SBT30100VFCT参数:型号:SBT30100VFCT最大重复峰值反向电压(VRRM):100V最大平均正向整流输出电流(IF):30A峰值正向浪涌电流(IFSM):250A每个元件的典型热阻(ReJA):2......