关于leetcode215题的一个小问题,java

来源:3-5 三路快排partition思路的应用 Sort Color

v不离不弃v

2020-02-16

波波老师您好,关于leetcode第215题,我有个问题,就是我在进行partition才做的时候,在随机替换arr[l]的时候,为什么在leetcode里面总是显示错误呢?我把那一句注释掉了之后就AC了
我的代码如下,运用了基于快速排序的quick selection方法:

class Solution {
    public int findKthLargest(int[] nums, int k) {
		int n=nums.length;
		return findKthLargest(nums,0,n-1,n-k);
	}
	private static int findKthLargest(int[]arr,int l,int r,int k) {
		if(l==r)
			return arr[l];
		int p=partition(arr,l,r);
		if(p==k)
			return arr[p];
		else if(k<p)
			return findKthLargest(arr,l,p-1,k);
		else
			return findKthLargest(arr,p+1,r,k);
	}
	private static int partition(int[] arr,int l,int r) {
		int j=l;
		//swap(arr,l,(int)(Math.random()*(r-l+1)+1));//这一句删除就AC
		int v=arr[l];
		for(int i=l+1;i<arr.length;i++) {
			if(arr[i]<v)
				swap(arr,++j,i);
		}
		swap(arr,l,j);
		return j;
	}
	private static void swap(int[] arr,int i,int j) {
		int temp=arr[i];
		arr[i]=arr[j];
		arr[j]=temp;
	}
	
}
写回答

2回答

liuyubobobo

2020-02-16

你的 partition 实现是错误的。循环终止条件是 i <= r。

0
3
liuyubobobo
回复
v不离不弃v
Leetcode 尤其是早期的问题测试数据非常不严格,错误的程序在有限的数据下可能得到正确的结果。继续加油!:)
2020-02-16
共3条回复

v不离不弃v

提问者

2020-02-16

swap(arr,l,(int)(Math.random()*(r-l+1))+1)我把1往后移动一个括号也是错的。。。。。

0
0

玩转算法面试-- Leetcode真题分门别类讲解

课程配套大量BAT面试真题,高频算法题解析,强化训练

7410 学习 · 1150 问题

查看课程