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 <= 104
  • 1 <= 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 <= 1000
  • 0 <= intervals[i][0] < intervals[i][1] <= 10^5
  • 对于所有的 i != jintervals[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的小根堆。

posted on 2022-02-07 11:01  阿ming  阅读(29)  评论(0)    收藏  举报

导航