剑指offer系列54---数组中出现次数超过一半的数

【题目】数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字。
* 例如输入一个长度为9的数组{1,2,3,2,2,2,5,4,2}。
* 由于数字2在数组中出现了5次,超过数组长度的一半,因此输出2。如果不存在则输出0。
* 【思路】首先取第一个数,之后的数与其比较。相同次数+1;不同次数-1.次数=0的时候将第一个数改为次数保存并将次数设置为1.
* 这里要考虑到如果出现次数最多的数字没有达到一半的话,就返回0;

 1 package com.exe11.offer;
 2
 3 /**
 4  * 【题目】数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字。
 5  *           例如输入一个长度为9的数组{1,2,3,2,2,2,5,4,2}。
 6  *           由于数字2在数组中出现了5次,超过数组长度的一半,因此输出2。如果不存在则输出0。
 7  * 【思路】首先取第一个数,之后的数与其比较。相同次数+1;不同次数-1.次数=0的时候将第一个数改为次数保存并将次数设置为1.
 8  *                这里要考虑到如果出现次数最多的数字没有达到一半的话,就返回0;
 9  * @author WGS
10  *
11  */
12 public class MoreThanHalfNumber {
13
14     boolean isValid=true;//全局变量用来表示次数没有一半情况
15
16     public int getMoreThanHalfNumber(int[] nums){
17
18         if(nums==null || nums.length<=0) return 0;
19         int index=0;
20         int times=0;
21         int target=nums[index];
22
23         while(index<nums.length){
24             if(times==0){
25                 target=nums[index];
26                 times=1;
27             }else if(nums[index]==target){
28                 times++;
29             }else{//nums[index]!=target
30                 times--;
31             }
32             index++;
33         }
34         //如果出现次数最多的数字没有达到数组长度一半的话,就返回0;
35         int times2=0;
36         for(int i=0;i<nums.length;i++){
37             if(nums[i]==target){
38                 times2++;
39             }
40         }
41         if(2*times2<=nums.length){
42             isValid=false;
43             return 0;
44         }
45
46         System.out.println(isValid);
47         return target;
48
49     }
50
51     public static void main(String[] args) {
52         MoreThanHalfNumber m=new MoreThanHalfNumber();
53         int[] nums=new int[]{1,2,3,2,5,4,2};
54         int n=m.getMoreThanHalfNumber(nums);
55         System.out.println(n);
56     }
57 }
时间: 2024-11-12 01:04:43

剑指offer系列54---数组中出现次数超过一半的数的相关文章

剑指offer 面试29—数组中出现次数超过一半的数字

题目: 数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字.例如输入一个长度为9的数组{1,2,3,2,2,2,5,4,2}.由于数字2在数组中出现了5次,超过数组长度的一半,因此输出2. 解法一: 先将数组排序,然后出现次数超过一半的数字就是a[n/2+1],时间复杂度O(nlgn). 解法二:O(n) 基本思想: 消除原理:在遍历数组的时候保存两个值:一个是数组中的一个数字,一个是次数.当我们遍历到下一个数字的时候,如果下一个数字和我们之前保存的数字相同,则次数加1.如果下一个数字

剑指offer python版 数组中出现次数超过一半的数字

def aa(nums): if not nums: return False hashes={} ret=[] for s in nums: hashes[s]=hashes[s]+1 if hashes.get(s) else 1 if hashes[s] >len(nums)/2: ret.append(s) return list(set(ret)) print(aa([1,2,3,2,2,2,2,2,3,2,3,3,4])) 原文地址:https://www.cnblogs.com/x

剑指offer系列——35.数组中的逆序对??

Q:在数组中的两个数字,如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对.输入一个数组,求出这个数组中的逆序对的总数P.并将P对1000000007取模的结果输出. 即输出P%1000000007 输入描述: 题目保证输入的数组中没有的相同的数字 数据范围: 对于%50的数据,size<=10^4 对于%75的数据,size<=10^5 对于%100的数据,size<=2*10^5 示例1 输入: 1,2,3,4,5,6,7,0 输出: 7 T:引用:https://blog.

剑指OFFER----面试题39. 数组中出现次数超过一半的数字

链接:https://leetcode-cn.com/problems/shu-zu-zhong-chu-xian-ci-shu-chao-guo-yi-ban-de-shu-zi-lcof/ 思路: cnt记录个数,val记录值:遍历数组,若等于val,则cnt++,否则cnt--,若cnt为0,则重置,最后val即为结果. 代码: class Solution { public: int majorityElement(vector<int>& nums) { int cnt =

【剑指offer】旋转数组中的最小值

题目总结: 1.若没有进行旋转,或者说旋转后的效果跟没有旋转是一样的,那么index1指示的值小于index2指示的值,返回index1的值. 2.若是一般性的旋转,那么最小的值旋转后肯定在中间,那么我们就可以从两边向中间夹逼. 3.夹逼的过程中,若 [ index1, middle ] 是有序的,说明这部分子区间没被破坏,旋转所移动的元素都在middle 的后面,那么最小值可定也在后面的部分,令 index1 = middle,继续向后夹逼:同理,若 [ middle ,index2 ] 是有

程序员面试题目总结--数组(三)【旋转数组的最小数字、旋转数组中查找指定数、两个排序数组所有元素中间值、数组中重复次数最多的数、数组中出现次数超过一半的数】

转!http://blog.csdn.net/dabusideqiang/article/details/38271661 11.求旋转数组的最小数字 题目:输入一个排好序的数组的一个旋转,输出旋转数组的最小元素. 分析:数组的旋转:把一个数组最开始的若干个元素搬到数组的末尾.例如数组{3, 4, 5, 1, 2}为{1, 2, 3, 4, 5}的一个旋转,该数组的最小值为1.这道题最直观的解法并不难.从头到尾遍历数组一次,就能找出最小的元素,时间复杂度显然是O(N).但这个思路没有利用输入数组

剑指offer系列61---数组中的逆序对

[题目]在数组中的两个数字,如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对.输入一个数组,求出这个数组中的逆序对的总数. * [思路]运用归并排序的思想. * 首先将数组分成两个子数组,统计子数组的逆序对: * 再合并,统计整个的逆序对. 1 package com.exe11.offer; 2 3 /** 4 * [题目]在数组中的两个数字,如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对.输入一个数组,求出这个数组中的逆序对的总数. 5 * [思路]运用归并排序的思想.

剑指offer系列24---数组中重复的数字

* [24] * [题目]在一个长度为n的数组里的所有数字都在0到n-1的范围内. * 数组中某些数字是重复的,但不知道有几个数字是重复的. * 也不知道每个数字重复几次. * 请找出数组中任意一个重复的数字. * 例如,如果输入长度为7的数组{2,3,1,0,2,5,3},那么对应的输出是重复的数字2或者3. 书上方法: 1 package com.exe6.offer; 2 /** 3 * [24] 4 * [题目]在一个长度为n的数组里的所有数字都在0到n-1的范围内. 5 * 数组中某些

剑指offer之【数组中重复的数字】

题目: 数组中重复的数字 链接: https://www.nowcoder.com/practice/623a5ac0ea5b4e5f95552655361ae0a8?tpId=13&tqId=11203&rp=3&ru=/ta/coding-interviews&qru=/ta/coding-interviews/question-ranking 题目描述: 在一个长度为n的数组里的所有数字都在0到n-1的范围内. 数组中某些数字是重复的,但不知道有几个数字是重复的.也不