首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    数组中出现次数超过一半的数字

    一、题目描述 数组中有一个数字出现次数超过数组长度的一半,请找出这个数字。 你可以假设数组是非空的,并且给定的数组总是存在多数元素。...示例 1: 输入: [1, 2, 3, 2, 2, 2, 5, 4, 2] 输出: 2 限制: 1 <= 数组长度 <= 50000 二、题目解析 题目明确说明了在这个数组中肯定有一个数字出现次数超过数组长度的一半...,可以假设这个数字是 x,并且假设每个数字的战斗力都是 1,那么其它所有数字、即非 x 的数字加起来的战斗力肯定是不如所有 x 加起来的战斗力。...那么我们可以制定以下的规则: 1、每个数字的战斗力都是 1,颜色相同的数字为同一组势力。 2、设置一个擂台,每个数字都需要轮番上擂台。 3、如果擂台上没有数字,那么该数字就是擂主。...数组中出现次数超过一半的数字 :https://leetcode-cn.com/problems/shu-zu-zhong-chu-xian-ci-shu-chao-guo-yi-ban-de-shu-zi-lcof

    28430

    数组中出现次数超过一半的数字

    题目描述 数组中有一个数字出现次数超过数组长度的一半,请找出这个数字。例如输入一个长度为9的数组{1,2,3,2,2,2,5,4,2}。由于数字2在数组中出现了5次,超过数组长度的一半,因此输出2。...1,2,3,4,5,6,7,8,9 (12)(34)(56)(78)(9),但是9出现次数并没有超过数组长度的一半,所以需要检查多的那个数是否超过数组长度的一半。...又比如 5, 1, 5, 2, 4, 3, 6, 7, 5 (51)(52)(43)(76)(5)最后留下了5,但是5出现次数并没有超过数组长度的一半,不符合。 ​...先在数组中随机选一个数字,然后调整数组中数字顺序,使得比选中的数字小的数字都排在它的左边,比选中的数字大的数字都排在它的右边,这也是快排思想。...此时中间的数字出现次数一定超过了数组长度的一半(当然需要检查,原因同方案一)。

    16800

    数组中出现次数超过一半的数字

    题目 数组中有一个数字出现次数超过数组长度的一半,请找出这个数字。例如输入一个长度为9的数组{1,2,3,2,2,2,5,4,2}。由于数字2在数组中出现了5次,超过数组长度的一半,因此输出2。...思路: 首先用一个数字survivor来保存幸存者方,用一个数字count来计算幸运者幸运值 规则:如果遇到相同数字代表相同阵营,count++; 如果遇到不同数字,则幸存者count--; 如果...注意如果存在超过一般的数字,那么这个数字肯定是幸存者,但是幸存者不一定是个数超过一般的那个.比如12213,幸存者是3,但是3个数没有超过一半.因此我们在得到幸存者后要进行验证 为什么说如果存在超过一半的数字...,那么这个数字肯定是幸存者?...因为如果极端的说,若其个数超过一半了,那么就算间隔着如12131514161,其他数字全由1出力干掉不用其他数字帮忙,最后也可以幸存1个 代码: public int MoreThanHalfNum_Solution

    27030

    数组中出现次数超过一半的数字

    题目:数组中有一个数字出现次数超过了数组长度的一半,找出这个数字。 看到这道题,我们马上就会想到,要是这个数组是排序的数组就好了。...如果是排序的数组,那么我们只要遍历一次就可以统计出每个数字出现次数,这样也就能找出符合要求的数字了。题目给出的数组没有说是排好序的,因此我们需要给它排序。...哈希表的键值(Key)为数组中的数字,值(Value)为该数字对应的次数。有了这个辅助的哈希表之后,我们只需要遍历数组中的每个数字,找到它在哈希表中对应的位置并增加它出现次数。...前 面两种思路都没有考虑到题目中数组的特性:数组中有个数字出现次数超过了数组长度的一半。也就是说,有个数字出现次数比其他所有数字出现次数的和还要 多。...由于我们要找的数字出现次数比其他所有数字出现次数之和还要多,那么要找的数字肯定是最后一次把次数设为1时对应的数字

    69160

    数组中出现次数超过一半的数字

    例如书中提到的面试官经常会要求不改变原数组,或者有空间限制等,尽量体现在代码中,保证读者可以不漏掉书中细节) 尽量精简话语,避免冗长解释 给出代码可运行,注释齐全,关注细节问题 题目介绍 数组中有一个数字出现次数超过数组长度的一半...这是一个典型的递归过程 找到这个数字后,再判断他是否符合条件(大于数组的一半),因为很有可能他是数组中出现次数最多的,但是未必大于数组的一半。 详细细节见代码注释。...如果有符合条件的数字,则它出现次数比其他所有数字出现次数和还要多。...在遍历数组时保存两个值: times:次数 result:当前数字 遍历下一个数字时,若它与之前保存的数字相同,则次数加1,否则次数减1;若次数为0,则保存下一个数字,并将次数置为1。...,并写入hashmap中,hashmap的值是该数字出现次数,并在每次循环中判断是否该数次数大于数组的一半,若有直接返回数字,否则遍历完数组返回0。

    81730

    算法-数字在排序数组中出现次数

    题目: 统计一个数字在排序数组中出现次数,比如排序数组为{1,2,3,3,3,4,5},那么数字3出现次数就是3。...3.最后,我们发现在排序数组中,如果我们知道了第一个3和最后一个3出现的位置,那么其实也就知道了个数,那么我们能否在第一次使用二分查找之后,继续使用二分法,找到两端的3?...如果中间的数字小于3,那么第一个和最后一个3肯定在右半边; ?...如果中间的数字等于3,那么需要判断这个3是不是第一个或最后一个3: 如果中间数字左侧相邻的数是3,那么第一个3一定在左半边: ?...如果中间数字左侧相邻的数不是3,那么第一个3就在中间: ? 如果中间数字右侧相邻的数是3,那么最后一个3一定在右半边: ?

    88850

    数组中出现次数超过一半的数字

    题目描述 数组中有一个数字出现次数超过数组长度的一半,请找出这个数字。例如输入一个长度为9的数组{1,2,3,2,2,2,5,4,2}。由于数字2在数组中出现了5次,超过数组长度的一半,因此输出2。...解题思路 三种解法: 法1:借助hashmap存储数组中每个数出现次数,最后看是否有数字出现次数超过数组长度的一半; 法2:排序。...数组排序后,如果某个数字出现次数超过数组的长度的一半,则一定会数组中间的位置。...所以我们取出排序后中间位置的数,统计一下它的出现次数是否大于数组长度的一半; 法3:某个数字出现次数大于数组长度的一半,意思就是它出现次数比其他所有数字出现次数和还要多。...数组中的数字;2. 次数。遍历下一个数字时,若它与之前保存的数字相同,则次数加1,否则次数减1;若次数为0,则保存下一个数字,并将次数置为1。遍历结束后,所保存的数字即为所求。

    45220

    数组中出现次数超过一半的数字

    例如书中提到的面试官经常会要求不改变原数组,或者有空间限制等,尽量体现在代码中,保证读者可以不漏掉书中细节) 尽量精简话语,避免冗长解释 给出代码可运行,注释齐全,关注细节问题 题目介绍 数组中有一个数字出现次数超过数组长度的一半...这是一个典型的递归过程 找到这个数字后,再判断他是否符合条件(大于数组的一半),因为很有可能他是数组中出现次数最多的,但是未必大于数组的一半。 详细细节见代码注释。...如果有符合条件的数字,则它出现次数比其他所有数字出现次数和还要多。...在遍历数组时保存两个值: times:次数 result:当前数字 遍历下一个数字时,若它与之前保存的数字相同,则次数加1,否则次数减1;若次数为0,则保存下一个数字,并将次数置为1。...,并写入hashmap中,hashmap的值是该数字出现次数,并在每次循环中判断是否该数次数大于数组的一半,若有直接返回数字,否则遍历完数组返回0。

    93820

    数字在升序数组中出现次数_37

    看到升序数组,那一般来说二分法跑不了 那么这里我提供下我的三种解法,两种二分法,一种hash存储; 1 .两次二分法分别找到第一次出现的该数字和最后一次出现的该数字位置 主要思路,在二分法第一次查到...k值的时候判断前面或者后面是否有也等于k值的,以此决定是否要前移或者后移来找到最左或者最右的k值点; 代码: public class Solution { //统计一个数字在排序数组中出现次数...查找k-0.5和k+0.5来获取这两者之间的数字个数就是k的个数 因为array中都是整数,所以可以稍微变一下,不是搜索k的两个位置,而是搜索k-0.5和k+0.5 这两个数应该插入的位置,然后相减即可

    33810

    每日一题:数组中数字出现次数2

    链接: 数组中数字出现次数2 这道题是前一次博客的另一个版本,想看上一个的链接在下面: 链接: 数组中数字出现次数1 ---- 这道题与上道题不太一样的是这里出现次数是3次还有1次的,所以异或的方法不太好整...我们想,既然这个数组里面只有一个数字出现一次,其他是三次,那用一个数组把这些出现三次的数字,把他们每个二进制位统计并相加,会发现这个统计的数组中的每个位的数字都会是3的倍数,那如果又多了一个出现一次的数...,那他某个二进制位上统计完加上去,会让这个数组里面某个位的数字变成模3余1,那么就可以找出这个数字为1的进制位,最后再用二进制的运算求出这个数字。...总的来说: 统计出数组中的所有的数,从第1位到第32位进制位有多少个1,然后找到数组中模3余1的位数,就是这个出现一次的数字的二进制位为1的位数。...j) & 1) == 1) { arr[j] += 1; } } } //看看哪一位是出现一次的

    34810

    数组中出现次数超过一半的数字_28

    方法1 ,利用排序 可以升序排序如果存在这个数,那么这个数一定在排序后的中间位置,且前面的数都是这个数字;但是这个用到了排序,最快时间复杂度也是nlog2n 方法2 守阵地法 思路:守阵地,遇到队友队伍加...1,遇到敌人,同归于尽一个,就是这么猛 首先用一个数字survivor来保存幸存者方,用一个数字count来计算幸运者幸运值 规则:如果遇到相同数字代表相同阵营,surCount++; 如果遇到不同数字...注意 如果存在超过一半的数字,那么这个数字肯定是幸存者,但是幸存者不一定是个数超过一般的那个.比如12213,幸存者是3,但是3个数没有超过一半.因此我们在得到幸存者后要进行验证 终极理解 为什么说如果存在超过一半的数字...,那么这个数字肯定是幸存者?...因为如果极端的说,若其个数超过一半了,那么就算间隔着如12131514161,其他数字全由1出力干掉不用其他数字帮忙,最后也可以幸存1个 public int MoreThanHalfNum_Solution

    19410
    领券