LeetCode78:颜色分类

news/2024/5/19 23:23:53 标签: 数据结构, 快速排序, 算法, leetcode, 排序算法
/*
 给定一个包含红色、白色和蓝色,一共 n 个元素的数组,原地对它们进行排序,使得相同颜色的元素相邻,并按照红色、白色、蓝色顺序排列。
 
 此题中,我们使用整数 0、 1 和 2 分别表示红色、白色和蓝色。
 
 注意:
 不能使用代码库中的排序函数来解决这道题。
 
 示例:
 
 输入: [2,0,2,1,1,0]
 输出: [0,0,1,1,2,2]
 */
#include <iostream>
#include <vector>
using namespace std;
class Solution {
public:
    void sortColors(vector<int>& nums) {
        //根据计数排序的思想,先遍历一遍数组,将==0和==1以及==2的数字个数统计出来,之后根据个数又赋值给数组相应的位置
        int count0=0;
        int count1=0;
        int count2=0;
        for(int i=0;i<nums.size();i++)
        {
            if(nums[i]==0)
                count0++;
            else if(nums[i]==1)
                count1++;
            else if(nums[i]==2)
                count2++;
        }
        int i=0;
        for(;i<count0;i++)
        {
            nums[i]=0;
        }
        for(;i<count0+count1;i++)
        {
            nums[i]=1;
        }
        for(;i<count0+count1+count2;i++)
        {
            nums[i]=2;
        }
    }
    //基于三路快速排序的思想,将==0,==1,==2进行分段处理
    void sortColors2(vector<int>& nums)
    {
        int zero=-1;    //nums[0...zero]==0
        int two=nums.size();    //nums[two...n-1]==2
        for(int i=0;i<two;) //这块不能写i++,因为当nums[i]的值为2的时候,交换完了之后不能i++,还要接着判断换过来的数字是几
        {
            if(nums[i]==1)
            {
                i++;
            }
            else if(nums[i]==2)
            {
                two--;
                swap(nums[i],nums[two]);
            }
            else
            {
                zero++;
                swap(nums[zero],nums[i]);
                i++;
            }
        }
    }
};
int main()
{
    vector<int> vec {0,1,2,2,2,2,0,1,1,0,0,1,1};
    Solution().sortColors2(vec);
    for(auto i: vec)
    {
        cout<<i<<" ";
    }
}


http://www.niftyadmin.cn/n/923608.html

相关文章

LeetCode215:数组中的第k个最大的元素

/*在未排序的数组中找到第 k 个最大的元素。请注意&#xff0c;你需要找的是数组排序后的第 k 个最大的元素&#xff0c;而不是第 k 个不同的元素。示例 1:输入: [3,2,1,5,6,4] 和 k 2输出: 5示例 2:输入: [3,2,3,1,2,4,5,5,6] 和 k 4输出: 4 */ #include <iostream> #…

如何设计一个公平的洗牌算法

什么叫公平呢&#xff1f;一旦你开始思考这个问题&#xff0c;其实答案不难想到。洗牌的结果是所有元素的一个排列。一副牌如果有 n 个元素&#xff0c;最终排列的可能性一共有 n! 个。公平的洗牌算法&#xff0c;应该能等概率地给出这 n! 个结果中的任意一个。 如思考虑到这一…

LeetCode167:Two Sun II-输入有序的数组

/*给定一个已按照升序排列 的有序数组&#xff0c;找到两个数使得它们相加之和等于目标数。函数应该返回这两个下标值 index1 和 index2&#xff0c;其中 index1 必须小于 index2。说明:返回的下标值&#xff08;index1 和 index2&#xff09;不是从零开始的。你可以假设每个输…

LeetCode11:盛水最多的容器

给定 n 个非负整数 a1&#xff0c;a2&#xff0c;...&#xff0c;an&#xff0c;每个数代表坐标中的一个点 (i, ai) 。在坐标内画 n 条垂直线&#xff0c;垂直线 i 的两个端点分别为 (i, ai) 和 (i, 0)。找出其中的两条线&#xff0c;使得它们与 x 轴共同构成的容器可以容纳最多…

LeetCode209:长度最小的子数组

/*给定一个含有 n 个正整数的数组和一个正整数 s &#xff0c;找出该数组中满足其和 ≥ s 的长度最小的连续子数组。如果不存在符合条件的连续子数组&#xff0c;返回 0。示例:输入: s 7, nums [2,3,1,2,4,3]输出: 2解释: 子数组 [4,3] 是该条件下的长度最小的连续子数组。*/…

LeeetCode3:无重复字符的最大长度

/*给定一个字符串&#xff0c;请你找出其中不含有重复字符的 最长子串 的长度。示例 1:输入: "abcabcbb"输出: 3解释: 因为无重复字符的最长子串是 "abc"&#xff0c;所以其长度为 3。示例 2:输入: "bbbbb"输出: 1解释: 因为无重复字符的最长子串…

LeetCode349:两个数组的交集

/*给定两个数组&#xff0c;编写一个函数来计算它们的交集。示例 1:输入: nums1 [1,2,2,1], nums2 [2,2]输出: [2]示例 2:输入: nums1 [4,9,5], nums2 [9,4,9,8,4]输出: [9,4]*/ /* 我们将nums1中的数据全部存储到一个set中&#xff0c;因为set默认是不能重复的&#xff0c…

LeetCode350:两个数字的交集II

/*给定两个数组&#xff0c;编写一个函数来计算它们的交集。示例 1:输入: nums1 [1,2,2,1], nums2 [2,2]输出: [2,2]示例 2:输入: nums1 [4,9,5], nums2 [9,4,9,8,4]输出: [4,9]*/ /*由于这次我们要输出所有的交集&#xff0c;包括重复的数字&#xff0c;所以我们就要声明一…