[编程之美]发帖“水王”问题

本文介绍了如何使用Moore's Voting Algorithm解决LeetCode上的169题 Majority Element 和229题 Majority Element II。通过两次遍历,算法能在线性时间和O(1)空间复杂度下找出数组中出现频率超过n/2或n/3的元素。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

        编程之美2.3节。正好对应leetcode上的第169题Majority Element和229题Majority Element II,该类问题可以总结为线性时间查找固定频率元素,应该使用Moore's voting algorithm,详细说明见链接


169. Majority Element

 

Given an array of size n, find the majority element. The majority element is the element that appears more than ⌊ n/2 ⌋ times.

You may assume that the array is non-empty and the majority element always exist in the array.





    public static int majorityElement(int[] nums) {
    	int re=0;
    	int count=0;
    	for(int i=0; i<nums.length; i++){
    		if(count==0){
    			re=nums[i];
    			count=1;
    		}else{
    			if(nums[i]==re){
    				count++;
    			}else{
    				count--;
    			}
    		}
    	}
    	return re;
    }


229. Majority Element II

 

Given an integer array of size n, find all elements that appear more than ⌊ n/3 ⌋ times. The algorithm should run in linear time and in O(1) space.









    public static List<Integer> majorityElement(int[] nums) {
    	List<Integer> re=new ArrayList<Integer>();
    	int[] num=new int[2];
    	int count0=0;
    	int count1=0;
    	
    	for(int i=0; i<nums.length; i++){
    		if(num[0]==nums[i]){
    			count0++;
    		}else if(num[1]==nums[i]){
    			count1++;
    		}else if(count0==0){
    			count0=1;
    			num[0]=nums[i];
    		}else if(count1==0){
    			count1=1;
    			num[1]=nums[i];
    		}else{
    			count0--;
    			count1--;
    		}
    	}
    	count0=0;
    	count1=0;
    	for(int i=0; i<nums.length; i++){
    		if(nums[i]==num[0]){
    			count0++;
    		}else if(nums[i]==num[1]){
    			count1++;
    		}
    	}
    	if(count0>nums.length/3){
    		re.add(num[0]);
    	}
    	if(count1>nums.length/3){
    		re.add(num[1]);
    	}
    	return re;
    }

总结:两个问题基本一样,核心思想就是频率超过n/3的数组肯定只有两个,所以建立一个长度为2的数组num,还有两个变量count0和count1分别记录num[0]和num[1]元素出现的次数,遍历一次以后数组中两个元素肯定是出现频率最高的两个,最后再遍历一次看数组中的元素是否满足超过n/3的要求。

资源下载链接为: https://pan.quark.cn/s/22ca96b7bd39 在当今的软件开发领域,自动化构建与发布是提升开发效率和项目质量的关键环节。Jenkins Pipeline作为一种强大的自动化工具,能够有效助力Java项目的快速构建、测试及部署。本文将详细介绍如何利用Jenkins Pipeline实现Java项目的自动化构建与发布。 Jenkins Pipeline简介 Jenkins Pipeline是运行在Jenkins上的一套工作流框架,它将原本分散在单个或多个节点上独立运行的任务串联起来,实现复杂流程的编排与可视化。它是Jenkins 2.X的核心特性之一,推动了Jenkins从持续集成(CI)向持续交付(CD)及DevOps的转变。 创建Pipeline项目 要使用Jenkins Pipeline自动化构建发布Java项目,首先需要创建Pipeline项目。具体步骤如下: 登录Jenkins,点击“新建项”,选择“Pipeline”。 输入项目名称和描述,点击“确定”。 在Pipeline脚本中定义项目字典、发版脚本和预发布脚本。 编写Pipeline脚本 Pipeline脚本是Jenkins Pipeline的核心,用于定义自动化构建和发布的流程。以下是一个简单的Pipeline脚本示例: 在上述脚本中,定义了四个阶段:Checkout、Build、Push package和Deploy/Rollback。每个阶段都可以根据实际需求进行配置和调整。 通过Jenkins Pipeline自动化构建发布Java项目,可以显著提升开发效率和项目质量。借助Pipeline,我们能够轻松实现自动化构建、测试和部署,从而提高项目的整体质量和可靠性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值