80.Median-中位数(容易题)

2024-04-22 13:38
文章标签 容易 median 中位数 80

本文主要是介绍80.Median-中位数(容易题),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

中位数

  1. 题目

    给定一个未排序的整数数组,找到其中位数。

    中位数是排序后数组的中间值,如果数组的个数是偶数个,则返回排序后数组的第N/2个数。

  2. 样例

    给出数组[4, 5, 1, 2, 3], 返回 3

    给出数组[7, 9, 4, 5],返回 5

  3. 挑战

    时间复杂度为O(n)

  4. 题解

1.Hashmap法,以空间换时间,时间复杂度为O(n)
先通过一次遍历得到最大值和最小值,并把元素值作为Hashmap的K、把元素出现的次数作为V。
需要注意的是中位数出现的位置应该是:

int count = n % 2 == 1 ? n / 2 + 1 : n / 2;

然后从最小值到最大值对Hashmap进行遍历,每找到一个元素就将count值减1(可以解释为什么count的下标为1而不是0),当count==0时Hashmap的K即是答案。

public class Solution {/*** @param nums: A list of integers.* @return: An integer denotes the middle number of the array.*/public int median(int[] nums) {int min = nums[0];int max = nums[0];int n = nums.length;HashMap<Integer,Integer> hashmap = new HashMap<>();for (int i=0;i<n;i++){int value = hashmap.containsKey(nums[i]) ? hashmap.get(nums[i])+1 : 1;hashmap.put(nums[i],value);min = min < nums[i] ? min : nums[i];max = max > nums[i] ? max : nums[i];}int count = n % 2 == 1 ? n / 2 + 1 : n / 2;for (int i = min;i<=max;i++){while (hashmap.containsKey(i) && hashmap.get(i)>0){--count;hashmap.put(i,hashmap.get(i)-1);if (count == 0){return i;}}}return Integer.MAX_VALUE;//表示出错}
}

2.Top K方法
本题的实质是查找数组中第(n-1)/2大的数,属于Top K问题,即使用快排思想解决问题,时间复杂度是O(n)。

public class Solution {/*** @param nums: A list of integers.* @return: An integer denotes the middle number of the array.*/public int median(int[] nums) {return getMinK(nums,0,nums.length-1,(nums.length-1)/2);}private int getMinK(int[] nums, int left, int right, int k){int i = left;int j = right;while (i != j){while (nums[j] >= nums[left] && i < j){j--;}while (nums[i] <= nums[left] && i < j){i++;}swap(nums,i,j);}swap(nums,left,i);if (i == k){return nums[i];}else if (i < k){return getMinK(nums,i+1,right,k);}else{return getMinK(nums,left,i-1,k);}}private void swap(int[] nums, int i, int j){int tmp = nums[i];nums[i] = nums[j];nums[j] = tmp;}
}

Last Update 2016.8.31

这篇关于80.Median-中位数(容易题)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/925926

相关文章

Docker容器创建时,无法访问镜像源:Could not connect to archive.ubuntu.com:80

1.问题描述 当基于dockerfile创建容器时,遇到Could not connect to ...、Failed to fetch ...等异常时,大概原因是没有配置好容器创建所需的镜像源。这里以Ubuntu基础镜像源为例。 dockerfile内容 FROM ubuntuRUN apt update && apt install python3 -y && apt install

全能AI神器!工作效率提升80倍!Zmo.ai带你玩转AI做图!

今天,我要给大家介绍一款神器:Zmo.ai。 这个平台简直是做图神器,集多种功能于一身,让你像专业人士一样轻松创建和编辑图像,不需要任何美术与设计基础,真的非常适合我们这些“手残党”! 我们只需单击按钮即可从文本或图像生成令人惊叹的 AI 艺术、图像、动漫和逼真的照片,最关键的是它的功能真的很全啊! Zmo.ai旗下产品分类: AI照片生成器 AI动漫生成器 AI照片编辑器 A

World of Warcraft [CLASSIC][80][Shushia][Molten Core][BOSS-5 Baron Geddon]

80级术士单杀[熔火之心]40人团队副本 [5号BOSS 迦顿男爵] BOSS技能①[点燃法力],每3秒燃烧400点法力值,实际上还附带400点伤害,持续5分钟 BOSS技能②[人体炸弹] :迦顿男爵会随机给一个人施放DEBUFF,被DEBUFF影响的人需要在最短时间内跑到远离人群的角落,等待炸弹爆炸。这个技能会造成3000+的伤害,并且会对周围一定范围内的玩家造成等量伤害,感觉我

【SGU】 114. Telecasting station 中位数

传送门:【SGU】 114. Telecasting station 题目分析:一个位置多个城市可以看成多个城市在同一位置,然后就可以求中位数了,易知最优的位置一定在中位数上。 代码如下 : #include <map>#include <vector>#include <cstdio>#include <cstring>#include <iostream>

算法/编程练习:两个有序数组的中位数

算法/编程练习:两个有序数组的中位数 题目来自LeetCode: https://leetcode-cn.com/problems/median-of-two-sorted-arrays/ 题目: 给定两个大小为 n1 和 n2 的有序(升序)数组 nums1 和 nums2 ,找出这两个有序数组的中位数mid。要求算法的时间复杂度为 O(log(m + n))。例如,输入: nu

初学java——关于数组容易忽视的地方总结

1:静态初始化:有程序员显示指定每个数组的初始化,由系统决定数组的长度。      动态初始化:程序员只指定数组长度,由系统为数组元素分配初始值。 2:java数组变量是一种引用类型的变量,引用的是堆内存中数组对象,而不是栈内存中的数组变量。例如数组int[] A={1,2,3};int[] B={4,5,6};当执行下面语句时:A=B;则int[] A={4,5,6};引用数组A时,变量为数

SQL进阶技巧:给定数字的频率查询中位数 | 中位值计算问题

目录 0 需求描述 1 数据准备 2 问题分析 方法1:按照频率将num值展开,转换成明细表,利用中位值公式 求解      abs(rn - (cnt+1)/2) < 1  方法2:中位值定义 3 小结 0 需求描述 num表: Column NameTypenumintfrequencyint num 是这张表的主键(具有唯一值的列)。这张表的每一行表示某个数字

独立站运营中容易陷入的误区

近年来,越来越多的跨境电商卖家选择独立站作为他们品牌的出海模式,但有些卖家花了很多时间精力在建站和投放广告上,却依旧无法获得一个好的效果,究其原因,可能是你在运营独立站的时候搞错了重点,本文整理了一些在独立站运营中容易陷入的误区,看看你是否踩坑了? 1、把过多精力放在建站上 建站是独立站运营的第一步,但绝不是最重要的,许多新手会把大量时间和精力放在建站上,这其实没有必要,市面上有许多成熟的

算法--------------------寻找两个有序数组的中位数

题目描述 给定两个大小为 m 和 n 的有序数组 nums1 和 nums2。请你找出这两个有序数组的中位数,并且要求算法的时间复杂度为 O(log(m + n))。你可以假设 nums1 和 nums2 不会同时为空。示例 1:nums1 = [1, 3]nums2 = [2]则中位数是 2.0示例 2:nums1 = [1, 2]nums2 = [3, 4]则中位数是 (2 + 3)/

深入分析网络编程中容易踩的坑

目录 1.TCP没考虑粘包分包 2.UDP没考虑丢包 3.长连接没考虑应用层心跳 4.大小端字节序问题 5.多线程发送乱序问题 6.大数据没考虑分片和流量控制 7.外网没考虑加密通信 8.客户端没考虑断线重连 1.TCP没考虑粘包分包   TCP是面向连接的可靠协议,TCP是流式协议,创建TCP套接字的类型为SOCK_STREAM int sockfd = socket(