LintCode 색상 배열 II

1746 단어

제목.


n개의 대상(k종의 다른 색을 포함하고 1~k에 따라 번호를 매긴다)이 있는 그룹을 지정하여 대상을 분류하여 같은 색의 대상을 인접시키고 1,2에 따라...k의 순서로 정렬하다.
주의 사항
You are not suppose to use the library's sort function for this problem.
k <= n
샘플은colors=[3,2,2,1,4],k=4를 보여 줍니다. 당신의 코드는 제자리에서 조작해서 그룹을 [1,2,2,3,4]로 만들어야 합니다.

분석하다.


사실은 정렬, 이분법 정렬

코드

class Solution {
    /**
     * @param colors: A list of integer
     * @param k: An integer
     * @return: nothing
     */
    public void sortColors2(int[] colors, int k) {
        if (colors == null || colors.length == 0) {
            return;
        }
        rainbowSort(colors, 0, colors.length - 1, 1, k);
    }
    
    public void rainbowSort(int[] colors,
                            int left,
                            int right,
                            int colorFrom,
                            int colorTo) {
        if (colorFrom == colorTo) {
            return;
        }
        
        if (left >= right) {
            return;
        }
        
        int colorMid = (colorFrom + colorTo) / 2;
        int l = left, r = right;
        while (l <= r) {
            while (l <= r && colors[l] <= colorMid) {
                l++;
            }
            while (l <= r && colors[r] > colorMid) {
                r--;
            }
            if (l <= r) {
                int temp = colors[l];
                colors[l] = colors[r];
                colors[r] = temp;
                
                l++;
                r--;
            }
        }
        
        rainbowSort(colors, left, r, colorFrom, colorMid);
        rainbowSort(colors, l, right, colorMid + 1, colorTo);
    }
}

좋은 웹페이지 즐겨찾기