第2章 排序 | | 第17节 三色排序练习题

  • 题目

有一个只由0,1,2三种元素构成的整数数组,请使用交换、原地排序而不是使用计数进行排序。

给定一个只含0,1,2的整数数组A及它的大小,请返回排序后的数组。保证数组大小小于等于500。

测试样例:

[0,1,1,0,2,2],6返回:[0,0,1,1,2,2]
  • 解析

class ThreeColor {
public:

    //思路有bug
    vector<int> sortThreeColor(vector<int> A, int n) {
        // write code here
        int i = 0;
        while (A[i] == 0)
            i++;
        int k = n - 1;
        while (A[k] == 2)
            k--;
        int j = i;
        while (j < k)
        {
            if (A[j] == 0)
            {
                swap(A[i], A[j]);
                while (A[i] == 0)
                    i++;
            }
            else if (A[j] == 2)
            {
                swap(A[j], A[k]);
                while (A[k] == 2)
                    k--;
            }
            else
            {
                j++;
            }
        }
        return A;
    }

    vector<int> sortThreeColor2(vector<int> A, int n) {
        // write code here
        // 利用快排思想
        int left = -1, right = n;
        int index = 0;
        while (index<right)
        {
            if (A[index]==0)
            {
                swap(A[++left],A[index]);
                index++;
            }else if (A[index]==2)
            {
                swap(A[index], A[--right]);
            }
            else
            {
                index++;
            }
        }
        return A;
    }
};
  • python
# -*- coding:utf-8 -*-

class ThreeColor:
    def sortThreeColor(self, A, n):
        # write code here
        left=-1
        right=n
        index=0
        while index<right:
            if A[index]==0:
                left+=1
                A[left],A[index]=A[index],A[left]
                index+=1
            elif A[index]==2:
                right-=1
                A[right],A[index]=A[index],A[right]
            else:
                index+=1
        return A

原文地址:https://www.cnblogs.com/ranjiewen/p/9194134.html

时间: 2024-11-05 13:17:24

第2章 排序 | | 第17节 三色排序练习题的相关文章

算法--三色排序练习题

三色排序练习题 第17节 三色排序练习题 有一个只由0,1,2三种元素构成的整数数组,请使用交换.原地排序而不是使用计数进行排序. 给定一个只含0,1,2的整数数组A及它的大小,请返回排序后的数组.保证数组大小小于等于500. 测试样例: [0,1,1,0,2,2],6 返回:[0,0,1,1,2,2] Java (javac 1.7) 代码自动补全 1 import java.util.*; 2 3 public class ThreeColor { 4 public int[] sortTh

排序练习题(四):三色排序

有一个只由0,1,2三种元素构成的整数数组,请使用交换.原地排序而不是使用计数进行排序. 给定一个只含0,1,2的整数数组A及它的大小,请返回排序后的数组.保证数组大小小于等于500. 测试样例: [0,1,1,0,2,2],6 返回:[0,0,1,1,2,2] public class ThreeColor { public int[] sortThreeColor(int[] A, int n) { // write code here int i=0; int j=0; int k=n-1

算法笔记 --- 三色排序

有一个只由0,1,2三种元素构成的整数数组,请使用交换.原地排序而不是使用计数进行排序. 给定一个只含0,1,2的整数数组A及它的大小,请返回排序后的数组.保证数组大小小于等于500. #include <iostream> #include <vector> using namespace std; class ThreeColor { public: vector<int> sortThreeColor(vector<int> A, int n) { /

第2章 排序 || 第15节 有序数组合并练习题

题目 有两个从小到大排序以后的数组A和B,其中A的末端有足够的缓冲空容纳B.请编写一个方法,将B合并入A并排序. 给定两个有序int数组A和B,A中的缓冲空用0填充,同时给定A和B的真实大小int n和int m,请返回合并后的数组. 解析 class Merge { public: int* mergeAB(int* A, int* B, int n, int m) { // write code here while(n>0&&m>0) { if(A[n-1]>B[m

第二章 排序 || 第19节 最短子数组练习题

题目 对于一个数组,请设计一个高效算法计算需要排序的最短子数组的长度. 给定一个int数组A和数组的大小n,请返回一个二元组,代表所求序列的长度.(原序列位置从0开始标号,若原序列有序,返回0).保证A中元素均为正整数. 测试样例: [1,4,6,5,9,10],6 返回:2 解析 C++版 class Subsequence { public: int shortestSubsequence(vector<int> A, int n) { // write code here int sta

第2章 排序 | 第14节 重复值判断练习题

题目 请设计一个高效算法,判断数组中是否有重复值.必须保证额外空间复杂度为O(1). 给定一个int数组A及它的大小n,请返回它是否有重复值. 测试样例: [1,2,3,4,5,5,6],7 返回:true 解析 class Checker { public: bool checkDuplicate(vector<int> a, int n) { // write code here if(n<=1) return false; sort(a.begin(),a.end()); for(

第二章 排序 || 第18节 有序矩阵查找练习题

题目 现在有一个行和列都排好序的矩阵,请设计一个高效算法,快速查找矩阵中是否含有值x. 给定一个int矩阵mat,同时给定矩阵大小nxm及待查找的数x,请返回一个bool值,代表矩阵中是否存在x.所有矩阵中数字及x均为int范围内整数.保证n和m均小于等于1000. 测试样例: [[1,2,3],[4,5,6],[7,8,9]],3,3,10 返回:false 解析 C++版 class Finder { public: bool findX(vector<vector<int> >

三色排序

题目大意: 给你红,白,蓝三种颜色的数组,要求按照红.白.蓝的顺序排序,leetcode链接:https://leetcode.com/problems/sort-colors/ 思路1: 直接给整个数组排序,时间复杂度O(nlogn) 思路2: 计数排序方法,使用一个类似hash的数组纪录每种颜色的个数,然后进行排序,但是需要遍历原数组两遍 思路3: 使用三个指针,p1表示红色和白色的分界线,p2表示白色和蓝色的分界线,i表示当前元素 即0~p1-1是红色的,p1~i-1表示白色的,p2+1~

(c语法百题18)三数排序

知识点: 借用第四变量对三个变量进行排序. 排序的算法,if语句 内容: 任意输入三个数 a.b.c,按由大到小的顺序打印出来 输入说明: 一行 三个整数 输出说明: 一行三个整数,由大到小 1 #include <stdio.h> 2 int main() 3 { 4 int a,b,c,t; 5 scanf("%d %d %d",&a,&b,&c); 6 if(a<b) 7 { 8 t=b; 9 b=a; 10 a=t; 11 } 12 i