第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

如何在 QuickSelect 中實現(xiàn)重復

如何在 QuickSelect 中實現(xiàn)重復

阿波羅的戰(zhàn)車 2022-01-12 15:17:32
我做了快速選擇算法,就是在一個數(shù)組中找到第k個最小的數(shù)。我的問題是,它只適用于沒有重復的數(shù)組。如果我有一個數(shù)組arr = {1,2,2,3,5,5,8,2,4,8,8}它會說第三小的數(shù)字是 2,但實際上是 3。我被困在做什么,這是我的兩個方法 quickSelect 和 Partition:private int quickselect(int[] array, int leftIndex, int rightIndex, int kthSmallest) {    if(kthSmallest > array.length - 1){        System.out.print("Number does not exist. Please enter a number less than: ");        return array.length - 1;    }    if (leftIndex == rightIndex) {        return array[leftIndex];    }    int indexOfPivot = generatePivot(leftIndex, rightIndex);    indexOfPivot = quickSelectPartition(array, leftIndex, rightIndex, indexOfPivot);    if (kthSmallest == indexOfPivot) {        return array[kthSmallest];    } else if (kthSmallest < indexOfPivot) {        return quickselect(array, leftIndex, indexOfPivot - 1, kthSmallest);    } else {        return quickselect(array, indexOfPivot + 1, rightIndex, kthSmallest);    }}private int quickSelectPartition(int[] array, int left, int right, int pivotIndex) {    int pivotValue = array[pivotIndex];    swapIndexes(array, pivotIndex, right);    int firstPointer = left;    for(int secondPointer = left; secondPointer < right; secondPointer++) {        if(array[secondPointer] < pivotValue) {            swapIndexes(array, firstPointer, secondPointer);            firstPointer++;        }    }    swapIndexes(array, right, firstPointer);    return firstPointer;}
查看完整描述

1 回答

?
慕神8447489

TA貢獻1780條經(jīng)驗 獲得超1個贊

如果增加2×N運行時間是可以接受的,您可以首先將不同的元素復制到一個新數(shù)組中:


private int[] getDistinct(int[] array) {

    Set<Integer> distinct = new HashSet<>();

    int endIdx = 0;


    for (int element : array) {


        if (distinct.add(element)) {

            array[endIdx++] = element;

        }

    }


    return Arrays.copyOfRange(array, 0, endIdx);

}

然后對此進行快速選擇:


int[] arr = new int[] {1, 2, 2, 3, 5, 5, 8, 2, 4, 8, 8};

int kthSmallest = 6;


int[] distinctArray = getDistinct(arr);

int kthSmallestElement = quickselect(distinctArray, 0, distinctArray.length - 1, kthSmallest - 1);


System.out.println(kthSmallestElement);

輸出:


8


查看完整回答
反對 回復 2022-01-12
  • 1 回答
  • 0 關注
  • 334 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網(wǎng)微信公眾號