时间效率
数组中出现次数超过一半的数字
数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字。例如输入一个长度为9的数组{1,2,3,2,2,2,5,4,2}。由于数字2在数组中出现了5次,超过数组长度的一半,因此输出2。如果不存在则输出0。
示例1
输入:1,2,3,2,2,2,5,4,2]
返回值:2
//解法一:直观解法,先排序 import java.util.Arrays; public class Solution { public int MoreThanHalfNum_Solution(int [] array) { Arrays.sort(array); int half=array.length/2; int count=0; for(int i=0;i<array.length;i++) { if(array[i]==array[half]) count++; } if(count>half) return array[half]; else return 0; } } //解法二:根据数组特点找出时间复杂度为O(n)的算法 public class Solution { public int MoreThanHalfNum_Solution(int [] array) { if(array.length==0) return 0; int times=1; int result=array[0]; for(int i=1;i<array.length;i++) { if(times==0) { result=array[i]; times=1; } else if(result==array[i]) times++; else times--; } //判断是否有出现次数超过一半的数字 int t=0; for(int i=0;i<array.length;i++) { if(array[i]==result) t++; } if(t*2>array.length) return result; else return 0; } }
最小的k个数
输入n个整数,找出其中最小的K个数。例如输入4,5,1,6,2,7,3,8这8个数字,则最小的4个数字是1,2,3,4。
示例1
输入:[4,5,1,6,2,7,3,8],4
返回值:[1,2,3,4]
import java.util.ArrayList; import java.lang.Math; public class Solution { public ArrayList<Integer> GetLeastNumbers_Solution(int [] input, int k) { ArrayList<Integer> a=new ArrayList<>(); if(input.length<k || k<=0) return a; int length=input.length; int start=0; int end=length-1; int index=Partion(input,start,end); while(index!=k-1) { System.out.println(index); if(index>k-1) { index=Partion(input,start,index-1); } if(index<k-1) { index=Partion(input,index+1,end); } } for(int i=0;i<k;i++) { a.add(input[i]); } return a; } public int Partion(int [] input ,int start,int end) { int length=end-start+1; int index=(int)Math.random()*(length)+start; Swap(input,index,end); int small=start-1; int e=input[end]; for(int i=start;i<end;i++) { int in=input[i]; if(input[i]<input[end]) { small++; System.out.println(small); if(small!=i) { Swap(input,small,i); } } } small++; Swap(input,small,end); return small; } public void Swap(int[] input,int a,int b) { int t=input[a]; input[a]=input[b]; input[b]=t; } }