首页 > 其他分享 >【双指针】75. 颜色分类、荷兰国旗问题

【双指针】75. 颜色分类、荷兰国旗问题

时间:2023-07-17 10:22:56浏览次数:38  
标签:count 国旗 temp nums ++ 75 var 指针

75. 颜色分类

给定一个包含红色、白色和蓝色、共 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

进阶:

你能想出一个仅使用常数空间的一趟扫描算法吗?

单指针两次遍历
class Solution {
    public void sortColors(int[] nums) {
        var len = nums.length;
        var count = 0;
        for(var i = 0; i < len; i++) {
            if(nums[i] == 0) {
                var temp = nums[i];
                nums[i] = nums[count];
                nums[count++] = temp;
            }
        }

        for(var i = count; i < len; i++) {
            if(nums[i] == 1) {
                var temp = nums[i];
                nums[i] = nums[count];
                nums[count++] = temp;
            }
        }
    }
}
双指针一次遍历
  • 使用两个指针i、j,分别指向数组开头连续的0、连续的1的最后一位
  • 使用k遍历数组,
    • 如果值为1,则存储到j的位置(交换nums[j]和nums[k]),然后j++
    • 如果值为0,存储到i(交换nums[i]和nums[k]),但是此时i的位置可能已经存储了1,所以:
      • 如果i < j,说明i的位置确实存储了1,所以上面交换完后nums[k]为1,再将其和nums[j++]交换,这样原本最前面的1就到了连续的1的最后面了
      • i++、j++,因为前移了一个0,所以i、j指针都需要后移
class Solution {
    public void sortColors(int[] nums) {
        var n = nums.length;

        var i = 0;
        var j = 0;

        for(var k = 0; k < n; k++) {
            if(nums[k] == 0) {
                var temp = nums[k];
                nums[k] = nums[i];
                nums[i] = temp; 
                if(i < j) {
                    temp = nums[k];
                    nums[k] = nums[j];
                    nums[j] = temp;
                }
                i++;
                j++;
            } else if(nums[k] == 1) {
                var temp = nums[k];
                nums[k] = nums[j];
                nums[j++] = temp; 
            }
            // System.out.println(Arrays.toString(nums));
        }
    }
}

标签:count,国旗,temp,nums,++,75,var,指针
From: https://www.cnblogs.com/tod4/p/17559273.html

相关文章

  • 7月16日 --指针
    #define_CRT_SECURE_NO_WARNINGS1#include<stdio.h>#include<string.h>structstu{ charname[20]; intage; charid[20];};intmain(){ inta=0; structstus1={"张三",20,"775513640"}; structstu*ps=&a......
  • Codeforces Round #875 (Div. 2) A-D
    比赛链接A代码#include<bits/stdc++.h>usingnamespacestd;usingll=longlong;boolsolve(){intn;cin>>n;for(inti=1;i<=n;i++){intx;cin>>x;cout<<n-x+1<<"......
  • 编写一个函数,令其交换两个int指针
    #include<iostream>#include<Windows.h>usingnamespacestd;voidChange1(int*&a,int*&b){int*tmp=a;a=b;b=tmp;}intmain(){inta=6,b=221;int*p=&a,*q=&b;cout<<"......
  • Java数组指针
    Java数组指针在Java中,数组是一种非常常见和重要的数据结构。数组允许我们在一个变量中存储多个相同类型的元素。但是,在使用数组时,有时候我们可能需要引用数组的指针,以便更方便地操作数组的元素。本文将介绍Java中的数组指针的概念,并提供相关的代码示例。什么是数组指针?在Java中,......
  • LeetCode 658. Find K Closest Elements 二分+双指针
    Givenasortedintegerarrayarr,twointegerskandx,returnthekclosestintegerstoxinthearray.Theresultshouldalsobesortedinascendingorder.Anintegeraisclosertoxthananintegerbif:|a-x|<|b-x|,or|a-x|==|b-x|an......
  • 初识指针以及一些创建指针变量的常见问题和一些避免使用错误指针的方法
    在C语言中,指针是一种变量,用于存储另一个变量的内存地址。指针可以指向任何数据类型的变量,包括基本数据类型(如整型、字符型等)和复合数据类型(如数组、结构体等)。通过指针,我们可以直接访问和修改指向的变量的值,而不需要知道变量的名称。指针的声明使用星号(*)来表示,例如:int*ptr;//......
  • 75.数组和对象有哪些原生方法,列举一下
    75.数组和对象有哪些原生方法,列举一下?数组和字符串的转换方法:toString()、toLocalString()、join()其中join()方法可以指定转换为字符串时的分隔符。数组尾部操作的方法pop()和push(),push方法可以传入多个参数。数组首部操作的方法shift()和unshift()重排序的方......
  • 指针数组,数组指针,函数
    指针数组指针数组,首先它是一个数组,数组里面的存储的是一个个指针,例如int*p[5];,指针数组里面的元素大小都是一样的,都是一个指针的大小,也就是8个字节(64位机器),sizeof(p);就为40个字节。下标的本质:下标的本质就是偏移量,[]的含义是解引用#include<stdio.h>intmain(void){ in......
  • Codeforces Round 875 (Div. 2)
    CodeforcesRound875(Div.2)A-TwinPermutations思路:让序列全相等为n+1即可#include<bits/stdc++.h>usingnamespacestd;typedefpair<int,int>PII;typedefpair<string,int>PSI;typedefpair<string,string>PSS;constintN=2e5+5,INF=0x3f3f......
  • 【ChernoC++笔记】智能指针
    【44】【ChernoC++】【中字】C++的智能指针智能指针(Smartpointers)是C++中的一种特殊类型,用于管理动态分配的内存资源。智能指针通过封装指针,并在适当的时机自动释放内存,从而避免内存泄漏和悬空指针等常见问题。unique_ptr❓为什么叫做uniqueptr?unique_ptr不能复制:如果复......