时间效率
数组中出现次数超过一半的数字
数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字。例如输入一个长度为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;
}
}

京公网安备 11010502036488号