• 超级水王问题



    超级水王

    给定一个数组arr,如果有某个数出现次数超过了数组长度的一半,打印这个数,如果没有不打印

    解题思路

    一次删掉两个不同值的数,如果arr中真的有水王的话,这个水王数一定会剩下来
    因为水王数是大于一半的次数的。哪怕其它所有的数字都跟水王数为敌
    水王数也会活下来,更不用说其它数字之间还会有内战的情况
    可能性
    1:没有数字剩下来,无水王数
    2:有数剩下来
    x剩下来,再遍历看x真实出现的次数跟N/2对比
    在这里插入图片描述

    怎么一次删除两个不同的数?
    时间复杂度O(N)
    空间复杂度0(1)
    两个变量
    1)候选
    2)血量
    当血量=0,认为没有候选人
    在这里插入图片描述
    一个个数遍历,三条规则:
    1)如果没有候选,当前数立为候选,血量+1
    2)如果有候选
    1.当前数跟候选不一样,血量–
    2.当前数是候选,血量++

    遍历完成后,如果血量=0,表示什么数也没有剩下来,如果血量不等于零,候选就是剩下来的数

    代码

    	public static void printHalfMajor(int[] arr) {
    		int cand = 0;
    		int HP = 0;
    		for (int i = 0; i < arr.length; i++) {
    			if (HP == 0) {
    				cand = arr[i];
    				HP = 1;
    			} else if (arr[i] == cand) {
    				HP++;
    			} else {
    				HP--;
    			}
    		}
    		if(HP == 0) {
    			System.out.println("no such number.");
    			return;
    		}
    		HP = 0;
    		for (int i = 0; i < arr.length; i++) {
    			if (arr[i] == cand) {
    				HP++;
    			}
    		}
    		if (HP > arr.length / 2) {
    			System.out.println(cand);
    		} else {
    			System.out.println("no such number.");
    		}
    	}
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29

    229. 多数元素 II

    给定一个大小为 n 的整数数组,找出其中所有出现超过 ⌊ n/3 ⌋ 次的元素。

    示例 1:

    输入:nums = [3,2,3]
    输出:[3]
    示例 2:

    输入:nums = [1]
    输出:[1]
    示例 3:

    输入:nums = [1,2]
    输出:[1,2]

    来源:力扣(LeetCode)
    链接:https://leetcode.cn/problems/majority-element-ii
    著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

    摩尔投票法

    与水王问题相似,思路是消耗血量,因为是找出出现超过 ⌊ n/3 ⌋ 次的元素
    我们可以推出最后最多剩下2个数字
    因为如果有3个数字都超过n/3,那么数组长度至少是n+3,不符合题目
    因此最多只有2个数字超过n/3

    我们需要设置两个hp来记录两个数的血量
    设置两个cand来记录哪两个数活到最后
    最后只需再遍历数组两个数是否符合超过n/3

    代码

    class Solution {
        public List<Integer> majorityElement(int[] nums) {
            int hp1=0;
            int cand1=0;
            int hp2=0;
            int cand2=0;
            int n=nums.length;
            for(int i=0;i<n;i++){
                if(hp1>0&&nums[i]==cand1){
                    hp1++;
                }else if(hp2>0&&nums[i]==cand2){
                    hp2++;
                }
                else if(hp1==0){
                    hp1=1;
                    cand1=nums[i];
                }else  if(hp2==0){
                    hp2=1;
                    cand2=nums[i];
                }
                else{
                    hp1--;
                    hp2--;
                }
            }
            List<Integer> ans=new ArrayList<>();
    
            int h1=0;
            int h2=0;
            for(int i=0;i<n;i++){
                if(hp1>0&&nums[i]==cand1){
                    h1++;
                }
                if(hp2>0&&nums[i]==cand2){
                    h2++;
                }
            }
            if(h1>n/3){
                ans.add(cand1);
            }
            if(h2>n/3){
                ans.add(cand2);
            }
            return ans;
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
  • 相关阅读:
    mysql 数据库数据恢复 库被删了怎么恢复数据库
    基于.NetCore开发博客项目 StarBlog - (4) markdown博客批量导入
    git报错OpenSSL SSL_read Connection was reset errno 10054
    win10桌面图标全部变成白色的怎么办
    ffmpeg推流报错
    HCIA-Datacom跟官方路线学习
    TLS 协议研究
    vivado查看报告和消息4
    高仿英雄联盟游戏网页制作作业 英雄联盟LOL游戏HTML网页设计模板 简单学生网页设计 静态HTML CSS网站制作成品
    ctfshow web入门 SQl注入 web191--web200
  • 原文地址:https://blog.csdn.net/xiaolu567/article/details/126186024