LeeCode( 排序)215_ 数组中的第K个最大元素

LeeCode( 排序)215_ 数组中的第K个最大元素

题目:
在未排序的数组中找到第 k 个最大的元素。请注意,你需要找的是数组排序后的第 k 个最大的元素,而不是第 k 个不同的元素。

示例 1:

输入: [3,2,1,5,6,4] 和 k = 2
输出: 5
示例 2:

输入: [3,2,3,1,2,4,5,5,6] 和 k = 4
输出: 4
说明:

你可以假设 k 总是有效的,且 1 ≤ k ≤ 数组的长度。

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/kth-largest-element-in-an-array
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

解题思路:
方法一:
直接调用java的Arrays.sort()
简单粗暴还高效

import java.util.Arrays;

public class 数组中的第K个最大元素 {

	public int findKthLargest(int[] nums, int k) {
		Arrays.sort(nums);
        return nums[nums.length - k];
    }
}

方法二:
Arrays.sort()虽然很香但是排序算法还是要会的。
直接写个快速排序,并进行优化。
我们知道快速排序的每一趟扫描都可以确定一个中间值(枢轴元素)pivot的坐标,所以可以优化一下代码,当这趟扫描确定的坐标==arr.length-k时直接返回结果。
(哭了,我的这串代码比Arrays.sort()的效率低了好几倍,看看就好。)


public class 数组中的第K个最大元素 {
	
	public int findKthLargest(int[] nums, int k) {
		quickSort(nums,0,nums.length-1,k);
		return nums[nums.length-k];
    }

	private static void quickSort(int[] arr, int start, int end,int k) {
        // 递归终止条件
        if (start >= end) {
            return;
        }
        // 第一步,找出分区后枢轴的下标,比如[2,1,3],枢轴为2,分区后枢轴的下标为1
        int pivotIndex = partition(arr, start, end);
        if(pivotIndex==arr.length-k)
        	return;
        // 第二步,对左子数组排序
        quickSort(arr, start, pivotIndex - 1,k);
        // 第三步,对右子数组排序
        quickSort(arr, pivotIndex + 1, end,k);
    }
	
	private static int partition(int[] arr, int start, int end) {
		//枢轴元素
		int pivot = arr[start];
		//左指针
		int left = start;
		int right = end;
		while(left < right){
			
			//从右往左扫描
			while(left < right && arr[right] >=pivot){
				right--;
			}
			if(left<right){
				arr[left] = arr[right];
				left++;
			}
			//从左往右扫描
			while(left < right && arr[left] <pivot){
				left++;
			}
			if(left<right){
				arr[right] = arr[left];
				right--;
			}
			
		}
		
		// 扫描完成后,将枢轴元素填入新坑中
        arr[left] = pivot;
        return left;
	}
	
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
LeetCode是一个在线的编程题库,提供了各种各样的算法和数据结构问题供开发者练习和提高编程能力。其中,提到了三个与数组相关的问题。 第一个引用是关于合并两个有序数组的问题,即将两个有序的整数数组合并成一个有序数组。具体的解法可以使用双指针法,分别指向两个数组的末尾,然后比较两个指针指向的元素大小,将较大的元素放入结果数组的末尾,然后将指针向前移动。这个过程重复直到其中一个数组遍历完毕,然后将剩下的元素依次放入结果数组中。 第二个引用是关于移除元素的问题,即移除数组中指定的元素,并返回新数组的长度。可以使用双指针法,左指针维护非指定元素的末尾位置,右指针遍历数组。当右指针指向的元素不等于指定元素时,将右指针指向的元素赋值给左指针指向的位置,然后将左指针和右指针都向前移动一位。直到右指针遍历完整个数组,最后返回左指针的值,即为新数组的长度。 第三个引用也是关于移动零元素的问题,即将数组中的零元素移动到数组末尾,同时保持非零元素的相对顺序不变。可以使用双指针法,左指针维护非零元素的末尾位置,右指针遍历数组。当右指针指向的元素不等于零时,将右指针指向的元素与左指针指向的元素交换位置,然后将左指针和右指针都向前移动一位。直到右指针遍历完整个数组,即完成了零元素的移动。 这些问题都可以使用双指针法解决,利用双指针在数组上进行遍历和操作,实现对数组的操作和处理。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [LeeCode每日一题–合并两个有序数组](https://download.csdn.net/download/weixin_38645669/14856034)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *2* *3* [LeeCode 数组题目](https://blog.csdn.net/weixin_43763903/article/details/114675786)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值