不及小步无以至千里,所以想要增强自己,只有不断练习。如果小编的文章对你有帮助,不要忘了关注加点赞哦!
目录
什么是水王数?
水王数:在一个列表当中出现次数超过总次数一半的数。
有什么用?
比如说美国的选举投票,总统想要一半以上的票,不然就重新进行选择投票。
解体思路!
题型:给定一个数列,请求出出现次数大于一半以上的数?要求:时间复杂度O(n),额外空间复杂度O(1)
1,首先我们需要2个变量,一个存储候选人(voters)一个统计候选人消除出现次数(hp)
2,逻辑思路:候选人出现次数大于所以其他数的总和,遍历数组,选取第一个个数为候选人,给定消除次数为1,当下一个数与候选人相同加1,(不同减1,并让下一个数当候选人),如此反复遍历到末尾的数,
#代码实现
for num in ls:
if hp == 0:#消除数后次数为0,创建候选
voters = num
hp = 1 #给它出现次数
elif voters != num: #如果数值与候选不一样-1
hp -= 1
else:#反之,相同加一
hp += 1
(有一种特殊情况,类似(1,2,3,4,5)用上面逻辑水王数就为5,但实际情况并不是,所以需要一个变量来统计一下候选人出现次数,当出现次数大于数组一半以上时,就确定是水王数)
#代码实现
cont = 0 # 出现次数
for i in ls:
if i==voters:
cont+=1
if cont>=len(ls)/2:
return voters
else:
return -1
完整代码(python):
'''
水王数的解决
作者:ls富
time:2021/6/4
'''
def witer_num(ls):
if len(ls)==0:
return -1
voters=0 #候选
hp=0 #出现消除后次数
for num in ls:
if hp == 0:#消除数后次数为0,创建候选
voters = num
hp = 1 #给它出现次数
elif voters != num: #如果数值与候选不一样-1
hp -= 1
else:#反之,相同加一
hp += 1
# 如果遍历完成后,没有候选
if hp == 0:
return -1
#有候选情况
cont = 0 # 出现次数
for i in ls:
if i==voters:
cont+=1
if cont>=len(ls)/2:
return voters
else:
return -1
if __name__ == '__main__':
ls=[3,2,3,3,3,4,5]
print(witer_num(ls))
完整代码(java版):
package com.itheima;
import java.util.Scanner;
public class Test {
public static void main(String[] args) {
int arr[]=new int[]{1,2,2,3,3,3};
System.out.println(water_number(arr));
}
public static int water_number(int[] args) {
if(args.length==0){
return -1;
}
int voters=0;
int hp=0;
int count=0;
for (int i =0;i<=args.length-1;i++){
if(hp==0){
voters=args[i];
hp=1;
}else if(voters !=args[i]){
hp--;
}else {
hp++;
}
}
if (hp == 0){
return -1;
}
for (int i =0;i<=args.length-1;i++){
if(args[i]==voters) {
count++;
}
}
if(count>=args.length/2){
return voters;
}else {
return -1;
}
}
}