2022-2-7数学day2
题1:
集合 s 包含从 1 到 n 的整数。不幸的是,因为数据错误,导致集合里面某一个数字复制了成了集合里面的另外一个数字的值,导致集合 丢失了一个数字 并且 有一个数字重复 。
给定一个数组 nums 代表了集合 S 发生错误后的结果。
请你找出重复出现的整数,再找到丢失的整数,将它们以数组的形式返回。
示例 1:
输入:nums = [1,2,2,4] 输出:[2,3]
示例 2:
输入:nums = [1,1] 输出:[1,2]
提示:
2 <= nums.length <= 1041 <= nums[i] <= 104
1 class Solution { 2 public int[] findErrorNums(int[] nums) { 3 int rep=0,loss=0,n=nums.length; 4 boolean[] flag=new boolean[n+1]; 5 for (int x:nums){ 6 if (!flag[x]) flag[x]=true; 7 else { 8 rep=x; 9 } 10 } 11 for (int i=1;i<n+1;i++) { 12 if (!flag[i]) loss=i; 13 } 14 return new int[]{rep,loss}; 15 } 16 }
思路:数学求和计算,原地标记法都可以。
题2:
给你一个区间列表,请你删除列表中被其他区间所覆盖的区间。
只有当 c <= a 且 b <= d 时,我们才认为区间 [a,b) 被区间 [c,d) 覆盖。
在完成所有删除操作后,请你返回列表中剩余区间的数目。
示例:
输入:intervals = [[1,4],[3,6],[2,8]] 输出:2 解释:区间 [3,6] 被区间 [2,8] 覆盖,所以它被删除了。
提示:
1 <= intervals.length <= 10000 <= intervals[i][0] < intervals[i][1] <= 10^5- 对于所有的
i != j:intervals[i] != intervals[j]
1 class Solution { 2 public int removeCoveredIntervals(int[][] intervals) { 3 Arrays.sort(intervals,(a,b)->{ 4 if (a[0]==b[0]) return b[1]-a[1]; 5 else return a[0]-b[0]; 6 }); 7 //起点升序排列,相同的情况 按照终点降序排列 8 int left=intervals[0][0],right=intervals[0][1],count=0; 9 for (int i=1;i<intervals.length;i++) { 10 int[] temp=intervals[i]; 11 // 完全覆盖 覆盖区间的个数++ 12 if (temp[0]>=left&&temp[1]<=right) count++; 13 // 可以合并区间 14 else if (temp[0]<=right&&temp[1]>=right){ 15 right=temp[1]; 16 // 完全不相干,更新新区间 17 }else if (temp[0]>right) { 18 left=temp[0]; 19 right=temp[1]; 20 } 21 } 22 return intervals.length-count; 23 } 24 }
思路:排序后的区间一共有三种情况,覆盖,合并 或者不相干。统计覆盖的个数,就可以得到最终的结果。
题3:
给定整数数组 nums 和整数 k,请返回数组中第 k 个最大的元素。
请注意,你需要找的是数组排序后的第 k 个最大的元素,而不是第 k 个不同的元素。
示例 1:
输入: [3,2,1,5,6,4] 和 k = 2
输出: 5
示例 2:
输入: [3,2,3,1,2,4,5,5,6] 和 k = 4
输出: 4
提示:
1 <= k <= nums.length <= 104-104 <= nums[i] <= 104
1 class Solution { 2 public int findKthLargest(int[] nums, int k) { 3 PriorityQueue<Integer> queue=new PriorityQueue<>(); 4 for (int x:nums) { 5 if (queue.size()==k) { 6 if (x>=queue.peek()) { 7 int a=queue.poll(); 8 queue.offer(x); 9 //System.out.println("弹出了"+a+"加入了 "+x); 10 } 11 }else { 12 queue.offer(x); 13 //System.out.println("加入了 "+x); 14 } 15 } 16 return queue.poll(); 17 } 18 }
思路:维护了一个大小为k的小根堆。
浙公网安备 33010602011771号