• leetcode - 365周赛


    一,2873.有序三元组中的最大值 I

     该题的数据范围小,直接遍历:

    1. class Solution {
    2. public long maximumTripletValue(int[] nums) {
    3. int n = nums.length;
    4. long ans = 0;
    5. for(int i=0; i<n-2; i++){
    6. for(int j=i+1; j<n-1; j++){
    7. for(int k=j+1; k<n; k++){
    8. ans = Math.max(ans,(long)(nums[i]-nums[j])*nums[k]);
    9. }
    10. }
    11. }
    12. return ans;
    13. }
    14. }

     二,2874.有序三元组中的最大值 II

    题目与上一题一样,只不过数据范围变大了,不能使用暴力,会超出时间限制。

    按照 j 来遍历数组:

            先定义一个数组,从后向前遍历,得到数组后缀最大值,在定义一个数组,从前向后遍历,得到数组前缀最大值,最后按照 j 从前往后遍历。

    1. class Solution {
    2. public long maximumTripletValue(int[] nums) {
    3. int n = nums.length;
    4. long ans = 0;
    5. int[] suf_max = new int[n];
    6. suf_max[n-1] = nums[n-1];
    7. for(int i=n-2; i>=0; i--){
    8. suf_max[i] = Math.max(suf_max[i+1],nums[i]);
    9. }
    10. int[] pre_max = new int[n];
    11. pre_max[0] = nums[0];
    12. for(int i=1; i<n; i++){
    13. pre_max[i] = Math.max(pre_max[i-1],nums[i]);
    14. }
    15. for(int j=1; j<n-1; j++){
    16. ans = Math.max(ans, (long)(pre_max[j-1]-nums[j])*suf_max[j+1]);
    17. }
    18. return ans;
    19. }
    20. }
    1. //解法二
    2. class Solution {
    3. public long maximumTripletValue(int[] nums) {
    4. long ans = 0;
    5. int pre_max = 0;//前缀最大值 - nums[i]
    6. int max_diff = 0;//(nums[i]-nums[j])最大值
    7. for(int x : nums){
    8. //x = nums[k]
    9. ans = Math.max(ans,(long)max_diff*x);
    10. //x = nums[j]
    11. max_diff = Math.max(max_diff,pre_max-x);
    12. //x = nums[i]
    13. pre_max = Math.max(pre_max,x);
    14. }
    15. return ans;
    16. }
    17. }

     三,2875.无限数组的最短子数组

     该题是一个滑动窗口题:我们实际上是计算环形数组中,是否有子数组和为 target % sum(nums),如果有就返回 子数组长度 + target / sum * len(nums),没有就返回 -1.

    1. class Solution {
    2. public int minSizeSubarray(int[] nums, int target) {
    3. int sum = 0;
    4. int total = 0;
    5. int ans = Integer.MAX_VALUE;
    6. int n = nums.length;
    7. for(int x : nums) total += x;
    8. for(int l=0,r=0; l<n; r++){
    9. sum += nums[r%n];
    10. while(sum > target%total){
    11. sum -= nums[l%n];
    12. l++;
    13. }
    14. if(sum == target%total)
    15. ans = Math.min(ans,r-l+1);
    16. }
    17. return ans==Integer.MAX_VALUE?-1:ans+target/total*n;
    18. }
    19. }

     四,2876.有向图访问计数

    1. class Solution {
    2. public int[] countVisitedNodes(List<Integer> edges) {
    3. int n = edges.size();
    4. List<Integer>[] rg = new ArrayList[n];
    5. int[] deg = new int[n];
    6. for(int i=0; i<n; i++)
    7. rg[i] = new ArrayList<>();
    8. for(int i=0; i<n; i++){
    9. int y = edges.get(i);//i -> y
    10. rg[y].add(i);//统计指向y的节点
    11. deg[y]++;//统计指向y的节点个数
    12. }
    13. //拓扑排序
    14. Queue<Integer> queue = new LinkedList<>();
    15. for(int i=0; i<n; i++){
    16. if(deg[i] == 0)//叶子节点
    17. queue.add(i);
    18. }
    19. while(!queue.isEmpty()){
    20. int x = queue.poll();
    21. int y = edges.get(x);//x -> y
    22. if(--deg[y] == 0)//删除树枝和叶子,保留环
    23. queue.add(y);
    24. }
    25. int[] ans = new int[n];
    26. for(int i=0; i<n; i++){
    27. if(deg[i] <= 0) continue;
    28. List<Integer> ring = new ArrayList<>();
    29. for(int x = i; ; x = edges.get(x)){
    30. deg[x] = -1;//防止重复
    31. ring.add(x);
    32. if(edges.get(x) == i)
    33. break;
    34. }
    35. for(int x : ring)
    36. rdfs(x,ring.size(),rg,deg,ans);
    37. }
    38. return ans;
    39. }
    40. //得到深度
    41. void rdfs(int x, int depth, List<Integer>[] rg, int[] deg, int[] ans){
    42. ans[x] = depth;
    43. for(int y : rg[x]){
    44. if(deg[y] == 0)
    45. rdfs(y,depth+1,rg,deg,ans);
    46. }
    47. }
    48. }

  • 相关阅读:
    基于springboot的物品回收系统
    【小程序】微信小程序设置globalData全局数据
    ipmitool下载地址和编译安装时可能出现的问题
    SpringBoot结合MyBatis实现多数据源配置
    [山东科技大学OJ]1226 Problem B: 寻求勾股数
    Android编译之常用配置及mk模板使用(汇总一)
    RISC-V峰会一周年,全志做了这些事
    Http请求参数类型及servlet获取方式
    用AI原生向量数据库Milvus Cloud 搭建一个 AI 聊天机器人
    opencv 形态学转换
  • 原文地址:https://blog.csdn.net/m0_74859835/article/details/133611766