首页 > 编程语言 >数组与贪心算法——452、435、646、406、169(1简4中)

数组与贪心算法——452、435、646、406、169(1简4中)

时间:2024-09-09 23:52:27浏览次数:3  
标签:return nums int 452 406 length 169 ans public

452. 用最少数量的箭引爆气球(中等)

有一些球形气球贴在一堵用 XY 平面表示的墙面上。墙面上的气球记录在整数数组 points ,其中points[i] = [xstart, xend] 表示水平直径在 xstart 和 xend之间的气球。你不知道气球的确切 y 坐标。

一支弓箭可以沿着 x 轴从不同点 完全垂直 地射出。在坐标 x 处射出一支箭,若有一个气球的直径的开始和结束坐标为 xstartxend, 且满足  xstart ≤ x ≤ xend,则该气球会被 引爆 。可以射出的弓箭的数量 没有限制 。 弓箭一旦被射出之后,可以无限地前进。

给你一个数组 points ,返回引爆所有气球所必须射出的 最小 弓箭数 

解法一、贪心

其实就是取交集的问题。如果当前区间左边界超过原有区间右边界,更新区间,加一支箭。

顺便吐槽下[[-2147483646,-2147483645],[2147483646,2147483647]]的用例是怎么想出来的wlfbb  直接溢出了导致排序错误

class Solution {
    public static int findMinArrowShots(int[][] points) {
		if(points.length == 1)return 1;
		Arrays.sort(points, new Comparator<int[]>() {
			@Override
			public int compare(int[] o1, int[] o2) {
				return (o1[1] > 0 && o2[1] < 0)? 1 : o1[1] - o2[1];
			}
		});
		int pre = points[0][1],ans = 1;
		for(int i = 1;i < points.length;i++){
			if(points[i][0] > pre){
				ans++;
				pre = points[i][1];
			}
		}
		return ans;

    }
}

 

435. 无重叠区间(中等)

给定一个区间的集合 intervals ,其中 intervals[i] = [starti, endi] 。返回 需要移除区间的最小数量,使剩余区间互不重叠 

解法一、贪心

对右区间排序,然后占了就删,不占就更新

class Solution {
    public int eraseOverlapIntervals(int[][] intervals) {
		if(intervals.length == 1)return 0;
		Arrays.sort(intervals, new Comparator<int[]>() {
			@Override
			public int compare(int[] o1, int[] o2) {
				return o1[1] - o2[1];
			}
		});
		int pre = intervals[0][1];
		int ans = 0;
		for(int i = 1;i < intervals.length;i++){
			if(intervals[i][0] >= pre){
				pre = intervals[i][1];
			}else{
				ans++;
			}
		}
		return ans;
    }
}

 

646. 最长数对链(中等)

给你一个由 n 个数对组成的数对数组 pairs ,其中 pairs[i] = [lefti, righti] 且 lefti < righti 。

现在,我们定义一种 跟随 关系,当且仅当 b < c 时,数对 p2 = [c, d] 才可以跟在 p1 = [a, b] 后面。我们用这种形式来构造 数对链 。

找出并返回能够形成的 最长数对链的长度 。

你不需要用到所有的数对,你可以以任何顺序选择其中的一些数对来构造。

解法一、贪心

其实可以复制435的答案然后减一下。。435是数多少个重叠,删了重叠的,其余互不重叠就是646

class Solution {
    public int findLongestChain(int[][] pairs) {
		if(pairs.length == 1)return 1;
		Arrays.sort(pairs, new Comparator<int[]>() {
			@Override
			public int compare(int[] o1, int[] o2) {
				return o1[1] - o2[1];
			}
		});
		int r = pairs[0][1],ans = 0;
		for(int i = 1;i < pairs.length;i++){
			if(pairs[i][0] > r){
				r = pairs[i][1];
			}else{
				ans++;
			}
		}
		return pairs.length - ans;
    }
}

406. 根据身高重建队列(中等)

假设有打乱顺序的一群人站成一个队列,数组 people 表示队列中一些人的属性(不一定按顺序)。每个 people[i] = [hi, ki]表示第 i 个人的身高为 hi ,前面 正好 有 ki 个身高大于或等于 hi 的人。

请你重新构造并返回输入数组 people 所表示的队列。返回的队列应该格式化为数组 queue ,其中 queue[j] = [hj, kj] 是队列中第 j 个人的属性(queue[0] 是排在队列前面的人)。

解法一、贪心

class Solution {
    public int[][] reconstructQueue(int[][] people) {

		Arrays.sort(people, new Comparator<int[]>() {
			@Override
			public int compare(int[] person1, int[] person2) {
				if (person1[0] != person2[0]) {
					return person1[0] - person2[0];
				} else {
					return person2[1] - person1[1];
				}
			}
		});
		int[][] res = new int[people.length][];
		for(int i = 0;i<people.length;i++){
			int space = people[i][1] + 1;
			for(int j = 0;j < res.length;j++){
				if(res[j] == null){
					space--;
					if(space == 0){
						res[j] = people[i];
                        break;
					}
				}
			}
		}
		return res;

    }
}

优化后会发现space的讨论是多余的,所有排序已经在比较器时就完成了。也就是说,身高从高到低排列,如果同等高度的话,排前面人多的那个站在后面,然后直接遍历插入即可。

	class Solution {
		public int[][] reconstructQueue(int[][] people) {
			Arrays.sort(people, new Comparator<int[]>() {
				public int compare(int[] person1, int[] person2) {
					if (person1[0] != person2[0]) {
						return person2[0] - person1[0];
					} else {
						return person1[1] - person2[1];
					}
				}
			});
			List<int[]> ans = new ArrayList<int[]>();
			for (int[] person : people) {
				ans.add(person[1], person);
			}
			return ans.toArray(new int[ans.size()][]);
		}

 169. 多数元素(简单)

给定一个大小为 n 的数组 nums ,返回其中的多数元素。多数元素是指在数组中出现次数 大于 ⌊ n/2 ⌋ 的元素。

你可以假设数组是非空的,并且给定的数组总是存在多数元素。

解法一、哈希表

解法二、排序

class Solution {
    public int majorityElement(int[] nums) {
        Arrays.sort(nums);
        return nums[nums.length / 2];
    }
}

作者:力扣官方题解
链接:https://leetcode.cn/problems/majority-element/solutions/146074/duo-shu-yuan-su-by-leetcode-solution/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

解法三、随机

random的写法比较好玩 其实就是随机一个数然后数它到不到n/2

class Solution {
    private int randRange(Random rand, int min, int max) {
        return rand.nextInt(max - min) + min;
    }

    private int countOccurences(int[] nums, int num) {
        int count = 0;
        for (int i = 0; i < nums.length; i++) {
            if (nums[i] == num) {
                count++;
            }
        }
        return count;
    }

    public int majorityElement(int[] nums) {
        Random rand = new Random();

        int majorityCount = nums.length / 2;

        while (true) {
            int candidate = nums[randRange(rand, 0, nums.length)];
            if (countOccurences(nums, candidate) > majorityCount) {
                return candidate;
            }
        }
    }
}

作者:力扣官方题解
链接:https://leetcode.cn/problems/majority-element/solutions/146074/duo-shu-yuan-su-by-leetcode-solution/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

解法四、分治

每次统计一个小区间

class Solution {
    private int countInRange(int[] nums, int num, int lo, int hi) {
        int count = 0;
        for (int i = lo; i <= hi; i++) {
            if (nums[i] == num) {
                count++;
            }
        }
        return count;
    }

    private int majorityElementRec(int[] nums, int lo, int hi) {
        // base case; the only element in an array of size 1 is the majority
        // element.
        if (lo == hi) {
            return nums[lo];
        }

        // recurse on left and right halves of this slice.
        int mid = (hi - lo) / 2 + lo;
        int left = majorityElementRec(nums, lo, mid);
        int right = majorityElementRec(nums, mid + 1, hi);

        // if the two halves agree on the majority element, return it.
        if (left == right) {
            return left;
        }

        // otherwise, count each element and return the "winner".
        int leftCount = countInRange(nums, left, lo, hi);
        int rightCount = countInRange(nums, right, lo, hi);

        return leftCount > rightCount ? left : right;
    }

    public int majorityElement(int[] nums) {
        return majorityElementRec(nums, 0, nums.length - 1);
    }
}

作者:力扣官方题解
链接:https://leetcode.cn/problems/majority-element/solutions/146074/duo-shu-yuan-su-by-leetcode-solution/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

解法五、投票

 这个真的还蛮有意思的。。

class Solution {
    public int majorityElement(int[] nums) {
        int count = 0;
        Integer candidate = null;

        for (int num : nums) {
            if (count == 0) {
                candidate = num;
            }
            count += (num == candidate) ? 1 : -1;
        }

        return candidate;
    }
}

作者:力扣官方题解
链接:https://leetcode.cn/problems/majority-element/solutions/146074/duo-shu-yuan-su-by-leetcode-solution/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

碎碎念

  • 452=取交集数量,435=减重叠,646=数重叠再减。 406其实还挺难,但是也考验比较器写法。感觉需要考虑题意,交集则靠右排序,右比左;并集则靠左排序,左比右。当然406这种更加灵活。感觉贪心类型的题,很多都相当于先排前x个,然后考虑x+1,直到x==n

标签:return,nums,int,452,406,length,169,ans,public
From: https://blog.csdn.net/Utgnryk/article/details/142053403

相关文章

  • LMR54406DBVR开关稳压器中文资料PDF数据手册引脚图参数功能框图
    LMR54406的说明LMR544xx是一款简单易用的宽VIN同步降压转换器,能够驱动高达1A和0.6A的负载电流。该器件具有4V至36V的宽输入范围,适用于从非稳压源进行电源调节的各种工业应用。LMR544xx以1.1MHz的开关频率运行,支持使用相对较小的电感器,以实现经优化的设计尺寸......
  • 2024.9.4 leetcode 169 多数元素 (哈希表)
    题面 169.多数元素-力扣(LeetCode)题解:复习(自学)了一下哈希表,unordered_map<int,int>umap定义一个表umap.find(nums[i])!=umap.end()判断是否存在umap.insert({nums[i],1})插入umap.erase(nums[i])清除C++容器类<unordered_map>|菜鸟教程(runoob.com)class......
  • 【Java】ApiPost请求返回 `406` 状态码(jackson)
    Java系列文章目录补充内容Windows通过SSH连接Linux第一章Linux基本命令的学习与Linux历史文章目录Java系列文章目录一、前言二、学习内容:三、问题描述3.1问题截图3.2错误简介3.2.1HTTP状态码`406NotAcceptable`3.2.2序列化和反序列化3.3后端问题位置四......
  • springboot博客交流平台-计算机毕业设计源码56406
    摘要博客交流平台作为一种重要的网络平台,为用户提供了展示自我、分享经验和与他人互动的空间。在国内外,研究者们关注博客交流平台的各个方面,并取得了显著的进展。研究内容主要包括用户体验和界面设计、社交化和互动性、多媒体内容支持、移动设备适配和跨平台体验、数据分......
  • 芯片闪存(FLASH)空间不够报错——.\Objects\SL_DEMO.axf: Error: L6406E: No space in
    目录问题描述:问题解决:问题分析:解决方法:1,2,问题描述:当出现这种报错的时候:.\Objects\SL_DEMO.axf:Error:L6406E:Nospaceinexecutionregionswith.ANYselectormatchingdrv_iap.o(i.EraseFlashSector).。是由于芯片闪存(FLASH)空间不够导致的问题解决:问题分析......
  • 2024.9.4 leetcode169 多数元素 (C++)
    题面https://leetcode.cn/problems/majority-element/description/ 解答一开始想得比较暴力,直接把对应数字当数组下标,遇到对应数字,数组++,但不知道怎么处理-10^9~10^9的数据大小,后来想了一个办法,那就是先排序,再求连续的个数,个数大于n/2的时候,return结果。太久没接触C++语法、......
  • Educational Codeforces Round 169(A-D)
    A.ClosestPoint        给你一组点。你必须在这个集合中加入一个整数的点,使它与集合中现有的每一个点不同,并且它成为与集合中每一个点**最近的点。这可能吗?(输入yesorno)    一道思路题,简单思考可以发现,如果数字超过两个,那么这题答案就是NO。当两个数字的......
  • 169.力扣-多数元素
    给定一个大小为 n 的数组 nums ,返回其中的多数元素。多数元素是指在数组中出现次数 大于 ⌊n/2⌋ 的元素。你可以假设数组是非空的,并且给定的数组总是存在多数元素。示例 1:输入:nums=[3,2,3]输出:3示例 2:输入:nums=[2,2,1,1,1,2,2]输出:2方法一:使用排序......
  • NetSarang Xshell(SSH客户端软件) v7.0.0169 中文绿色版
    概述NetSarangXshell破解版是一款免费SSH客户端软件的Linux远程监控工具.Xshell中文版,轻松管理远程主机服务器,会话管理器,支持多选项卡管理主机.Xftp7最新版以及Xshell7最新版支持远程协议Telnet,Rlogin,SSH/SSHPKCS#11,SFTP,Serial,具有Unicode编码支持,动态端口转发,自定......
  • 169、和贾至舍人《早朝大明宫》之作
    169、和贾至舍人《早朝大明宫》之作唐●岑参鸡鸣紫陌曙光寒,莺啭皇州春色阑。金阙晓钟开万户,玉阶仙仗拥千官。花迎剑佩星初落,柳拂旌旗露未干。独有凤凰池上客,阳春一曲和皆难。 【现代诗意译】和贾至舍人《早朝大明宫》之作 雄鸡开始啼鸣,京城大街映照在一片清寒的曙光......