【HackerRank】Find the Median(Partition找到数组中位数)

In the Quicksort challenges, you sorted an entire array. Sometimes, you just need specific information about a list of numbers, and doing a full sort would be unnecessary. Can you figure out a way to use your partition code to find the median in an array?

Challenge 
Given a list of numbers, can you find the median?

Input Format 
There will be two lines of input:

  • n - the size of the array
  • ar - n numbers that makes up the array

Output Format 
Output one integer, the median.

Constraints 
1<= n <= 1000001 
-10000 <= x <= 10000 , x ∈ ar 
There will be an odd number of elements.



题解:久闻Partition函数可以用来找到乱序数组的中位数,今天终于实现了一把。

设置一个变量need为数组长度的一半,另一个变量hasFound为当前比找到的比中位数小的数的个数,当hasFound=need的时候,我们就找到了中位数。

在每次Partition后,看比pivot小的那部分数组有多少个元素,如果hasFound加上这部分元素正好等于need,那么pivot就是所求的中位数。如果hasFound加上这部分元素大于need,说明比pivot小的这部分数组需要继续划分,递归的调用Partition;如果hasFound加上这部分元素小于need,那么就把这部分元素个数加到hasFound上,并且继续划分比pivot大的那部分数组。

例如数组:3 1 4 5 2,找中位数的过程如下图所示:

代码如下:

 1 import java.util.*;
 2
 3 public class Solution {
 4     private static int need = 0;
 5     private static int hasFound = 0;
 6
 7     private static void swap(int[] ar,int i,int j){
 8         int temp = ar[i];
 9         ar[i]= ar[j];
10         ar[j]=temp;
11     }
12     private static int Partition(int[] ar,int start,int end){
13         int pivot = ar[end];
14         int i = start;
15         int j = start;
16         while(i < end){
17             if(ar[i] >= pivot)
18                 i++;
19             else if(ar[i] < pivot){
20                 swap(ar,i,j);
21                 i++;
22                 j++;
23             }
24         }
25         swap(ar, j, end);
26         if(hasFound+j-start+1==need)
27             return pivot;
28         else if(hasFound+j-start+1<need){
29             hasFound += j-start+1;
30             return Partition(ar, j+1, end);
31         }
32         else {
33             return Partition(ar, start, j-1);
34         }
35
36     }
37
38     public static void main(String[] args) {
39         Scanner in = new Scanner(System.in);
40         int n = in.nextInt();
41         need = n%2==0?n/2:n/2+1;
42         int[] ar = new int[n];
43
44         for(int i = 0;i < n;i ++)
45             ar[i] = in.nextInt();
46         System.out.println(Partition(ar, 0, n-1));
47
48     }
49 }

以上代码就很容易扩展到找寻数组中第k小的数了,只要改变need变量的值即可。

【HackerRank】Find the Median(Partition找到数组中位数)

时间: 2024-10-06 13:27:58

【HackerRank】Find the Median(Partition找到数组中位数)的相关文章

找到数组中唯一重复的数

#include<iostream> #include<algorithm> #include<numeric> using namespace std; int helper1(int a[],int n) { int sum = accumulate(a,a+n,0); int sum2 = n*(n-1)/2; return sum-sum2; } int helper2(int a[],int n) { int bitor = a[0]^0; for(int i

不用比较找到数组中两个不同的值

/**     *    找到数组中两个不同的值     *     /     public static void main(String[] args) { int[] arr={2,2,1,1,3,4}; int eo = eh(arr); int offset = getOffset(eo); int eo1 = 0; for(int i:arr){ if(((i>>offset)&1)==1)continue; eo1 ^= i; } System.out.println(

【ShareCode】不错的技术文章 -- 如何使用异或(XOR)运算找到数组中缺失的数?

如何使用异或(XOR)运算找到数组中缺失的数? 今天给大家分享一篇关于使用XOR(异或)运算找到数组中缺失的数的问题. 在一次Javascript面试中,有这么一个问题: 假设有一个由0到99(包含99)的整数组成的长度为100的数组.从数组中随机移除一个元素,得到了一个长度为99的数组,那么请问如何找到所取出的数字是几?(假设数组未排序). 大多数面试者都是按照如下方法解答的: 首先对数组进行排序,然后遍历一遍数组,检查数组中相邻两项的的差,如果差大于1,则找到缺失的数字. 这是一种有效的算法

无序数组array, 找到数组中两个数的最大差值

题目链接: 无序数组array, 找到数组中两个数的最大差值, 且大数出现在小数之后,如:arr[i]-arr[j], 且 i<j.比如: array 是 [2, 3, 10, 6, 4, 8, 1],最大差值是8(10-2) 解题思路: 记录当前访问过的数组中的最小值 min_val; 2) 当前元素值arr[i] - min_val 和 max_diff作比较 若大于 max_diff , 则更新它的值 1 import javax.validation.constraints.Min; 2

算法总结之 在两个长度相等的排序数组中找到上中位数

题目描述: arr1  和 arr2   长度都为N   求两个数组中所有数的上中位数 要求 时间复杂度 O(logN)  额外空间复杂度O(1) 这道题目的方法比较好玩: 这两个数组如下表示: arr1[start1....end1]     arr2[start2...end2] 如果start1==start2  那么也有start2==end2   此时元素总个数是2个,上中位数为最小的那个 如果start1!=start2  令mid1={start1+end1}/2      mid

【递归打卡1】在两个长度相等的排序数组中找到上中位数

[题目] 给定两个有序数组arr1和arr2,已知两个数组的长度都为N,求两个数组中所有数的上中位数.要求时间复杂度O(logN),空间复杂度O(1) [举例] 例如 arr1 = [1, 2,3,4],arr2 = [3,4,5,6]. 总共8个数,则中位数就是第 4 小的数,为 3. 例如 arr1 = [0,1,2],arr2 = [3,4,5]. 总共6个数,则中位数就是第 3 小的数,为 2. [难度] 中 解答 这道题可以采用递归来解决,注意,这道题数组是有序的,所以它有如下特点:

【转】在两个长度相等的排序数组中找到上中位数

[题目] 给定两个有序数组arr1和arr2,已知两个数组的长度都为N,求两个数组中所有数的上中位数.要求时间复杂度O(logN),空间复杂度O(1) [举例] 例如 arr1 = [1, 2,3,4],arr2 = [3,4,5,6]. 总共8个数,则中位数就是第 4 小的数,为 3. 例如 arr1 = [0,1,2],arr2 = [3,4,5]. 总共6个数,则中位数就是第 3 小的数,为 2. [难度] 中 解答 这道题可以采用递归来解决,注意,这道题数组是有序的,所以它有如下特点:

2011 找到两个数组中位数

思想:分别求A,B的中位数,若a=吧,则a或b为所求中位数,否则,舍弃a,b中最小者所在序列之较小一半,同时舍弃较大者所在序列较大一半,要求两次舍弃元素个数相同,重复上述过程,直到两个序列中只含一个元素为止,则较小者为所求中位数. 代码: int search(int a[],int b[],int n) { int s1,e1,mid1,s2,e2,mid2; s1=0;e1=n-1;s2=1;e2=n-1; while(s1!=e1||s2!=e2) { mid1=(s1+e1)/2; mi

无序数组中位数

(1) 最小堆算法 首先将数组的前(n+1)/2个元素建立一个最小堆. 然后,对于下一个元素,和堆顶的元素比较,如果小于等于,丢弃之,接着看下一个元素.如果大于,则用该元素取代堆顶,再调整堆,接着看下一个元素.重复这个步骤,直到数组为空. 当数组都遍历完了,那么,堆顶的元素即是中位数. 1 #include "stdafx.h" 2 #include <iostream> 3 using namespace std; 4 5 const int MAX_SIZE = 100