【leetcode】75. Sort Colors

本文深入探讨了LeetCode上经典问题“Sort Colors”的多种解决方案,包括两头夹逼法、平移插入法及三路快排。通过这些方法,文章详细讲解了如何在不使用库排序函数的情况下,对红、白、蓝三种颜色的对象进行排序。

75. Sort Colors

Given an array with n objects colored red, white or blue, sort them in-place so that objects of the same color are adjacent, with the colors in the order red, white and blue.

Here, we will use the integers 0, 1, and 2 to represent the color red, white, and blue respectively.

Note: You are not suppose to use the library's sort function for this problem.

Example:

Input: [2,0,2,1,1,0]
Output: [0,0,1,1,2,2]

Follow up:

  • A rather straight forward solution is a two-pass algorithm using counting sort.
    First, iterate the array counting number of 0's, 1's, and 2's, then overwrite array with total number of 0's, then 1's and followed by 2's.
  • Could you come up with a one-pass algorithm using only constant space?

题目链接:https://leetcode.com/problems/sort-colors/

 

1.两头夹逼法(非in-place):

双指针对0和2进行排序,一个指向0的最后一位,一个指向2的第一位,都从数组两端向中间移动。

对原始数组进行遍历,

class Solution {
public:
    void sortColors(vector<int>& nums) {
        int len = nums.size();
        int l = 0, r = len - 1;
        vector<int> res(len);
        for (int i = 0; i < len; ++i){
            if (nums[i] == 0){
                res[l++] = 0;
            }else if (nums[i] == 2){
                res[r--] = 2;
            }
        }
        while (l <= r){
            res[l++] = 1;
        }
        return res;
    }
};

2.平移插入法(one pass的计数排序)

每一种颜色对应一个指针,记录在排序数组中 对应颜色的最后一个元素的位置。

class Solution {
public:
    void sortColors(vector<int> A) {
        int i = -1;
        int j = -1;
        int k = -1;
        int n = A.size();
        for(int p = 0; p < n; p ++)
        {
            //根据第i个数字,挪动0~i-1串。
            if(A[p] == 0)
            {
                A[++k] = 2;    //2往后挪
                A[++j] = 1;    //1往后挪
                A[++i] = 0;    //0往后挪
            }
            else if(A[p] == 1)
            {
                A[++k] = 2;
                A[++j] = 1;
            }
            else
                A[++k] = 2;
        }

    }
};

3.三路排序

如果颜色种类很多,就当作排序算法来做。一般数组有较多重复元素的,会使用三路快排,好像也是java里排序算法的实现。

class Solution {
public:
    void sortColors(vector<int>& nums) {
        int len = nums.size();
        int l = -1, r = len;
        for(int i = 0; i<r;){
            if (nums[i] == 0){
                swap(nums[++l], nums[i++]);
            }else if(nums[i] == 2){
                swap(nums[--r], nums[i]);
            }else{
                ++i;
            }
        }
    }
};

 

源码地址: https://pan.quark.cn/s/3916362e5d0a 在C#编程平台下,构建一个曲线编辑器是一项融合了图形用户界面(GUI)构建、数据管理及数学运算的应用开发任务。 接下来将系统性地介绍这个曲线编辑器开发过程中的核心知识点:1. **定制曲线面板展示数据曲线**: - 控件选用:在C#的Windows Forms或WPF框架中,有多种控件可用于曲线呈现,例如PictureBox或用户自定义的UserControl。 通过处理重绘事件,借助Graphics对象执行绘图动作,如运用DrawCurve方。 - 数据图形化:通过线性或贝塞尔曲线连接数据点,以呈现数据演变态势。 这要求掌握直线与曲线的数学描述,例如两点间的直线公式、三次贝塞尔曲线等。 - 坐标系统与缩放比例:构建X轴和Y轴,设定坐标标记,并开发缩放功能,使用户可察看不同区间内的数据。 2. **在时间轴上配置多个关键帧数据**: - 时间轴构建:开发一个时间轴组件,显示时间单位刻度,并允许用户在特定时间点设置关键帧。 时间可表现为连续形式或离散形式,关键帧对应于时间轴上的标识。 - 关键帧维护:利用数据结构(例如List或Dictionary)保存关键帧,涵盖时间戳和关联值。 需考虑关键帧的添加、移除及调整位置功能。 3. **调整关键帧数据,通过插值方获得曲线**: - 插值方:依据关键帧信息,选用插值方(如线性插值、样条插值,特别是Catmull-Rom样条)生成平滑曲线。 这涉及数学运算,确保曲线在关键帧之间无缝衔接。 - 即时反馈:在编辑关键帧时,即时刷新曲线显示,优化用户体验。 4. **曲线数据的输出**: - 文件类型:挑选适宜的文件格式存储数据,例如XML、JSON或...
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值