21xrx.com
2024-12-22 22:30:15 Sunday
登录
文章检索 我的文章 写文章
作为一名Java程序员
2023-06-12 18:32:22 深夜i     --     --
Java 最大的k个数 代码

作为一名Java程序员,我常常需要在我的代码中找出最大的k个数。在这篇文章中,我将分享一些我学到的关于如何在Java中实现这一问题的方法和技巧。

首先,让我们看一下使用Java内置函数的方法。我们可以使用Java中的Collections类来对一个集合做排序,然后再取出前k个数。以下是一个示例代码:


List nums = Arrays.asList(1, 3, 2, 5, 4, 7, 6, 9, 8);

int k = 3;

Collections.sort(nums, Collections.reverseOrder());

List maxKNums = nums.subList(0, k);

System.out.println(maxKNums);

这个示例代码中,我们先将要查找的数放入一个List中,然后使用Collections.sort方法进行排序(使用Collections.reverseOrder可以做降序排序),最后使用subList方法取出前k个数。

接下来,我们看看使用最小堆解决问题的方法。在Java中,我们可以使用PriorityQueue类来实现最小堆。以下是一个示例代码:


List nums = Arrays.asList(1, 3, 2, 5, 4, 7, 6, 9, 8);

int k = 3;

PriorityQueue minHeap = new PriorityQueue<>();

for (Integer num : nums) {

  if (minHeap.size() < k) {

    minHeap.offer(num);

  } else {

    int top = minHeap.peek();

    if (num > top) {

      minHeap.poll();

      minHeap.offer(num);

    }

  }

}

List maxKNums = new ArrayList<>(minHeap);

Collections.sort(maxKNums, Collections.reverseOrder());

System.out.println(maxKNums);

这个示例代码中,我们先将要查找的数放入一个List中,然后使用PriorityQueue实现最小堆。我们遍历整个List,并在将每个数字插入堆的同时保持堆的大小为k。如果堆的大小小于k,我们直接将数字插入堆中,如果堆的大小已经为k,我们将新的数字与堆顶数字比较,如果它比堆顶数字大,我们删除堆顶数字并插入新的数字。最后,我们将堆中的数字取出并进行排序,以得到前k个最大的数字。

最后,我们来看看使用快速选择算法实现的方法。以下是一个示例代码:


int[] nums = 5;

int k = 3;

quickSelect(nums, 0, nums.length - 1, k - 1);

for (int i = 0; i < k; i++) {

  System.out.print(nums[i] + " ");

}

public void quickSelect(int[] nums, int start, int end, int k) {

  if (start >= end)

    return;

  

  int pivot = nums[start];

  int i = start + 1, j = end;

  while (i <= j) {

    if (nums[i] < pivot && nums[j] > pivot) {

      swap(nums, i++, j--);

    }

    if (nums[i] >= pivot) {

      i++;

    }

    if (nums[j] <= pivot)

      j--;

    

  }

  swap(nums, start, j);

  if (j == k)

    return;

   else if (j < k) {

    quickSelect(nums, j + 1, end, k);

  } else {

    quickSelect(nums, start, j - 1, k);

  }

}

public void swap(int[] nums, int i, int j) {

  int temp = nums[i];

  nums[i] = nums[j];

  nums[j] = temp;

}

这个示例代码中,我们将要查找的数存储为一个int数组。我们使用快速选择算法来找到数组中第k个最大的数字。其中,快速选择算法的实现是一个递归的过程,它将数组分为两半,并将比pivot大的数字放在数组的左边,比pivot小的数字放在数组的右边。这样做的时间复杂度为O(n),因此,快速选择是解决这一问题的最优解。

综上所述,这篇文章介绍了三种在Java中实现查找最大的k个数的方法:使用Java内置函数、使用最小堆和使用快速选择算法。每种方法都有其优点和缺点,我们需要根据实际情况选择合适的方法。如果你想深入研究这些方法,可以自己编写代码并进行练习。

  
  

评论区

{{item['qq_nickname']}}
()
回复
回复