首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在QuickSelect中实现副本

如何在QuickSelect中实现副本
EN

Stack Overflow用户
提问于 2018-11-11 10:39:58
回答 1查看 674关注 0票数 2

我制定了快速选择算法,即在数组中找到最小的kth数。我的问题是,它只适用于没有重复的数组。如果我有一个数组

arr ={1,2,2,3,5,8,8,2,4,8}

它会说第三个最小数是2,但实际上是3。

我被困在该做什么上了,下面是我的两个方法quickSelect和Partition:

代码语言:javascript
复制
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;
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-11-11 15:56:10

如果添加

运行时间是可以接受的,您可以首先将不同的元素复制到一个新的数组中:

代码语言:javascript
复制
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);
}

然后对此进行快速选择:

代码语言:javascript
复制
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);

输出:

代码语言:javascript
复制
8
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/53247925

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档