剑指offer29:数组中出现次数超过一半的数字



有两种思路: 1.最简单就是使用hashMap,循环遍历,将每个数字的值和次数作为key 和value保存到map中,最后循环遍历map,取出value,大于数组长度的一半就输出, 这样空间复杂度就很大,引入了额外的内存

import java.util.*;
public class Solution {
    public int MoreThanHalfNum_Solution(int [] arr) { 
       if(arr.length==0){
           return 0;
        }
         int time =1;
          HashMap<Integer, Integer> hashMap = new HashMap<Integer,Integer>();
          for (int i = 0; i < arr.length; i++) {
               if(hashMap.containsKey(arr[i])){
                      time = hashMap.get(arr[i]);
                      hashMap.put(arr[i], ++time);
               }else{
                   hashMap.put(arr[i], 1);
               }
               time = hashMap.get(arr[i]);
               if(time>arr.length/2){
                     return arr[i];
               }
        }
        return 0;
    }
}


2. 第二种思路就是,数组中这个数字出现的次数超过了总数的一半,也就是说他比其他所有数字出现的总次数还要多,那么我们可以考虑在遍历数组的时候保存两个值,一个数数组中的数字,一个是次数,当我们遍历到下一个数字的时候,如果下一个数字和我们之前保存的数字相同,次数就+1,如果不同,我们就将次数-1,当次数为0的时候,我们保存下一个数字,并将他的次数设为1

import java.util.*;
public class Solution {
    public int MoreThanHalfNum_Solution(int [] arr) {  
       if(arr.length==0){ 
           return 0;
        }
        int time = 1;   //次数  
		int result = arr[0]; 
        int count = 0;
		for (int i = 1; i < arr.length; i++) {
			   if(time==0){ 
				  result =  arr[i]; 
				  time = 1;
			   }else if(arr[i]==result){ 
				     time++;
			   }else{ 
				   time--;
			   } 
		} 
         
          for (int i = 0; i < arr.length; i++) {
			   if(arr[i]==result){ 
				 count++;
			   }
		  } 
		 if(count>arr.length/2){ 
				return result;
		 }else{ 
			 return 0;
		 }
       		
		
    }
}




`````` **有两种思路: 1.最简单就是使用hashMap,循环遍历,将每个数字的值和次数作为key 和value保存到map中,最后循环遍历map,取出value,大于数组长度的一半就输出, 这样空间复杂度就很大,引入了额外的内存 2. 第二种思路就是,数组中这个数字出现的次数超过了总数的一半,也就是说他比其他所有数字出现的总次数还要多,那么我们可以考虑在遍历数组的时候保存两个值,一个数数组中的数字,一个是次数,当我们遍历到下一个数字的时候,如果下一个数字和我们之前保存的数字相同,次数就+1,如果不同,我们就将次数-1,当次数为0的时候,我们保存下一个数字,并将他的次数设为1**import java.util.*;public class Solution { public int MoreThanHalfNum_Solution(int [] arr) { if(arr.length==0){return 0; } int time = 1; //次数int result = arr[0];int count = 0; for (int i = 1; i < arr.length; i++) { if(time==0){result = arr[i]; time = 1; }else if(arr[i]==result){time++; }else{time--; }} for (int i = 0; i < arr.length; i++) { if(arr[i]==result){count++; } }if(count>arr.length/2){return result; }else{return 0; }}}``````
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值