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


    

    剑指OfferP163

    题目:找出数组中一个出现次数超过整个数组长度一般的数字

     

    解法一:将原问题转化为求数组的中位数,採用高速排序的思想,每一次Partition取末位为哨兵,遍历将小于、大于哨兵的数分别移至哨兵左右,最后返回哨兵在处理后的数组中的位置。不断缩小要处理的数组的长度大小。终于确定返回值为数组长度一半的元素。即为中位数。

     

    解法二:因为题设该数字出现的次数大于其它全部数字出现的次数。故用两个变量,一个表示数字num_data,一个表示次数。当下一个数字等于num_data时。则times1。如若不等于,time1。直至times等于0,则将num_data更换为下一个数字;由题知,最后得到的num_data的结果必为所要求得的值。

    public class MoreThanHalfNum {
    
    	/*****************实现方法一**********************/
    	//解法一:基于Partition方法
    	public int MoreThanHalfNum1(int[] data){
    		if((data == null) || data.length == 0){
    			return 0;
    		}
    		//先进行一次Partition
    		int target = data.length >> 1;//目标index
    		int start = 0;
    		int end = data.length - 1;//设定默认初始值
    		int index = Parttition(data, start, end);
    		
    		while(index != target){
    			if(index < target)<span style="font-family: Arial, Helvetica, sans-serif;">{</span><span style="font-family: Arial, Helvetica, sans-serif;">//表示中位数在data[index]后半部分</span>
    				start = index  + 1;
    			}
    			else   <span style="font-family: Arial, Helvetica, sans-serif;">{</span><span style="font-family: Arial, Helvetica, sans-serif;">//表示中位数在data[index]前半部分 </span>
    				end = index - 1; 
    			}
    			index = Parttition(data, start, end);
    		}
    		//推断找到的数在原数组是否确实有>n/2个
    		return Judge(data, data[index]);
    	}
    	
    	//推断找到的数在原数组是否确实有>n/2个
    	private int Judge(int[] data, int target_num){
    		int times = 0;
    		for(int num : data){
    			if(num == target_num){
    				times++;
    			}
    		}
    		return times*2 > data.length ?

    target_num : 0; } //高速排序的核心方法 private int Parttition(int[] data,int start,int end){ //选取哨兵 int mid_num = data[end]; int index = start;//位置记录 for(int i = start; i < end; i++){ if(data[i] > mid_num){ swap(data, i, index); } else { index++ ; } } swap(data, index, end); return index; } //无法像C++一样使用引用实现。故仅仅好使用data数组进行改变 private void swap(int[] data , int a, int b){ int temp = data[a]; data[a] = data[b]; data[b] = temp; } /*****************实现方法二******************/ public int MoreThanHalfNum2(int[] data){ if((data == null) || data.length == 0){ return 0; } int num = data[0];//记录数据 int times = 1;//记录次数 for(int data_num : data){ if(0 == times){ num = data_num; times ++; } else if(num == data_num){ times++; } else{ times--; } } return Judge(data, num); } public static void main(String[] args) { int[] data = {1,2,3,2,2,2,5,4,2}; MoreThanHalfNum moreThanHalfNum = new MoreThanHalfNum(); System.out.println(moreThanHalfNum.MoreThanHalfNum2(data)); } }


  • 相关阅读:
    二进制,八进制,十进制,十六进制之间的转换
    using关键字的使用
    简单工厂和单例设计模式
    面向对象的七种设计原则
    第六章 初始继承和多态
    第五章项目:体检套餐管理系统
    第二章《深入C#数据类型》项目经理评分
    <<MySchool数据库设计优化>> 内部测试
    Python 日志处理(一) 按Nginx log_format 分割日志记录
    Python 爬虫练习(一) 爬取国内代理ip
  • 原文地址:https://www.cnblogs.com/lytwajue/p/6919846.html
Copyright © 2020-2023  润新知