首页 > 其他分享 >[Leetcode Weekly Contest]367

[Leetcode Weekly Contest]367

时间:2023-10-16 20:13:03浏览次数:38  
标签:下标 Contest int res nums valueDifference grid 367 Leetcode

链接:LeetCode

[Leetcode]2903. 找出满足差值条件的下标 I

给你一个下标从 0 开始、长度为 n 的整数数组 nums ,以及整数 indexDifference 和整数 valueDifference 。
你的任务是从范围 [0, n - 1] 内找出 2 个满足下述所有条件的下标 i 和 j :

  • abs(i - j) >= indexDifference 且
  • abs(nums[i] - nums[j]) >= valueDifference

返回整数数组 answer。如果存在满足题目要求的两个下标,则 answer = [i, j] ;否则,answer = [-1, -1] 。如果存在多组可供选择的下标对,只需要返回其中任意一组即可。
注意:i 和 j 可能 相等 。

遍历循环即可。

class Solution {
    public int[] findIndices(int[] nums, int indexDifference, int valueDifference) {
        int[] res = new int[] {-1,-1};
        int n = nums.length;
        for(int i=0;i<n;++i) {
            for(int j=i+indexDifference;j<n;++j) {
                if(Math.abs(nums[j]-nums[i]) >= valueDifference) {
                    res[0] = i;
                    res[1] = j;
                    return res;
                }
            }
        }
        return res;
    }
}

[Leetcode]2904. 最短且字典序最小的美丽子字符串

如果 s 的某个子字符串中 1 的个数恰好等于 k ,则称这个子字符串是一个 美丽子字符串 。
令 len 等于 最短 美丽子字符串的长度。
返回长度等于 len 且字典序 最小 的美丽子字符串。如果 s 中不含美丽子字符串,则返回一个 空 字符串。
对于相同长度的两个字符串 a 和 b ,如果在 a 和 b 出现不同的第一个位置上,a 中该位置上的字符严格大于 b 中的对应字符,则认为字符串 a 字典序 大于 字符串 b 。
例如,"abcd" 的字典序大于 "abcc" ,因为两个字符串出现不同的第一个位置对应第四个字符,而 d 大于 c 。

滑动窗口。如果窗口内的 1 的个数超过 k,或者窗口端点是 0,就可以缩小窗口。

class Solution {
    public String shortestBeautifulSubstring(String s, int k) {
        String res = "";
        int minLength = Integer.MAX_VALUE;
        int start = 0, count = 0;
        for(int i=0;i<s.length();++i) {
            if(s.charAt(i) == '1') count ++;
            while (start < i && (count > k || s.charAt(start) == '0')) {
                count -= (s.charAt(start) - '0');
                start ++;
            }

            if(count == k) {
                if(i-start+1 <= minLength) {
                    if(i-start+1 == minLength) res = getMinString(res, s.substring(start, i+1));
                    else res = s.substring(start, i+1);
                    minLength = i-start+1;
                }
            }
        }
        return res;
    }

    private String getMinString(String a, String b) {
        for(int i=0;i<a.length();++i) {
            if(a.charAt(i) < b.charAt(i)) return a;
            else if(a.charAt(i) > b.charAt(i)) return b;
        }
        return a;
    }
}

[Leetcode]2905. 找出满足差值条件的下标 II

给你一个下标从 0 开始、长度为 n 的整数数组 nums ,以及整数 indexDifference 和整数 valueDifference 。
你的任务是从范围 [0, n - 1] 内找出 2 个满足下述所有条件的下标 i 和 j :

  • abs(i - j) >= indexDifference 且
  • abs(nums[i] - nums[j]) >= valueDifference

返回整数数组 answer。如果存在满足题目要求的两个下标,则 answer = [i, j] ;否则,answer = [-1, -1] 。如果存在多组可供选择的下标对,只需要返回其中任意一组即可。
注意:i 和 j 可能 相等 。

滑动窗口。维护每个元素的前缀和后缀的最大值和最小值的「下标」;模拟窗口大小为 indexDifference 的滑动窗口,判断端点的前后缀的最值能否构造目标方案。另外,可以我们发现最值具备单调性,因此我们没必要预处理所有下标的最值,可以在一次遍历的过程中边维护最值,边检查方案。

class Solution {
    public int[] findIndices(int[] nums, int indexDifference, int valueDifference) {
        int[] res = new int[]{-1, -1};
        int min = nums[0], max = nums[0];
        // Also can use two points to point to the min index and max index
        Map<Integer, Integer> indexs = new HashMap<>();
        for(int i=indexDifference;i<nums.length;++i) {
            min = Math.min(min, nums[i-indexDifference]);
            max = Math.max(max, nums[i-indexDifference]);
            indexs.put(nums[i-indexDifference],i-indexDifference);
            if(nums[i] - min >= valueDifference) {
                res[0] = i;
                res[1] = indexs.get(min);
                return res;
            }
            if(max - nums[i] >= valueDifference) {
                res[0] = i;
                res[1] = indexs.get(max);
                return res;
            }
        }
        return res;
    }
}

[Leetcode]2906. 构造乘积矩阵

给你一个下标从 0 开始、大小为 n * m 的二维整数矩阵 grid ,定义一个下标从 0 开始、大小为 n * m 的的二维矩阵 p。如果满足以下条件,则称 p 为 grid 的 乘积矩阵 :
对于每个元素 p[i][j] ,它的值等于除了 grid[i][j] 外所有元素的乘积。乘积对 12345 取余数。
返回 grid 的乘积矩阵。

前后缀分解。核心思想:把矩阵拉成一维的,我们需要算出每个数左边所有数的乘积,以及右边所有数的乘积,这都可以用递推得到。
时间复杂度:\(\mathcal{O}(nm)\),其中 n 和 m 分别为 \(\textit{grid}\) 的行数和列数。
空间复杂度:\(\mathcal{O}(1)\)。返回值不计入。

class Solution {
    public int[][] constructProductMatrix(int[][] grid) {
        int n = grid.length,  m = grid[0].length;
        int[][] res = new int[n][m];
        int[] left = new int[n*m];
        int[] right = new int[n*m];
        Arrays.fill(left, 1);
        Arrays.fill(right, 1);
        for(int i=0;i<n;++i) {
            for(int j=0;j<m;++j) {
                if(i == n-1 && j == m-1) continue;
                left[i*m+j+1] = (left[i*m+j] * (grid[i][j] % 12345))% 12345;
            }
        }
        for(int i=n-1;i>=0;--i) {
            for(int j=m-1;j>=0;--j) {
                if(i == 0 && j == 0) continue;
                right[i*m+j-1] = (right[i*m+j] * (grid[i][j] % 12345))% 12345;
            }
        }
        for(int i=0;i<n;++i) {
            for(int j=0;j<m;++j) {
                res[i][j] = (left[i*m+j] * right[i*m+j]) % 12345;
            }
        }
        return res;
    }
}

参考:LeetCode

标签:下标,Contest,int,res,nums,valueDifference,grid,367,Leetcode
From: https://www.cnblogs.com/hellojamest/p/17768238.html

相关文章

  • Atcoder Regular Contest 167
    卡B下大分了,怎么回事呢。A.ToastsforBreakfastParty发现题意是让方差尽可能小,就是让\(A\)里的值尽可能接近。所以从小到大排个序,把\(A_{N,\dots,N-M+1}\)依次放进\(1,2,\dots,M\),再把\(A_{N-M,\dots,1}\)依次放进\(M,M-1,\dots,2M-N+1\)就赢了。B.Productof......
  • AtCoder Beginner Contest 324
    在高铁上加训!A-Same(abc324A)题目大意给定\(n\)个数,问是否都相等。解题思路判断是不是全部数属于第一个数即可。或者直接拿set去重。神奇的代码#include<bits/stdc++.h>usingnamespacestd;usingLL=longlong;intmain(void){ios::sync_with_stdio(f......
  • AtCoder Beginner Contest 180 F Unbranched
    洛谷传送门AtCoder传送门首先进行一个容斥,把连通块最大值\(=K\)变成\(\leK\)的方案数减去\(\leK-1\)的方案数。考虑dp,设\(f_{i,j}\)表示当前用了\(i\)个点,\(j\)条边。转移即枚举其中一个连通块的大小\(k\)。为了不算重,我们强制让这个连通块包含点\(1\),类......
  • 周赛363 Leetcode 2861. 最大合金数
    题解k个小问题,对每台机器分别计算这台机器最多能制造出多少合金,然后所有机器取max,就是最大合金数。参数太多不好直接算如果暴力,枚举制造1份合金,2份合金,...,但是budget和stock都是1e8,会超时但是暴力可以给我们一个启发:制造的合金数越多,花的钱越多。我们是否可以猜一个答案?如果......
  • LeetCode54. 螺旋矩阵Ⅰ
    题目描述给你一个m行n列的矩阵matrix,请按照顺时针螺旋顺序,返回矩阵中的所有元素。示例提交的代码classSolution{publicList<Integer>spiralOrder(int[][]matrix){//行数intm=matrix.length;//列数intn=matrix[0].......
  • #yyds干货盘点# LeetCode程序员面试金典:H 指数
    题目:给你一个整数数组 citations ,其中 citations[i] 表示研究者的第 i 篇论文被引用的次数。计算并返回该研究者的 h 指数。根据维基百科上 h指数的定义:h 代表“高引用次数”,一名科研人员的 h 指数 是指他(她)至少发表了 h 篇论文,并且每篇论文 至少 被引用 h 次......
  • #yyds干货盘点# LeetCode程序员面试金典:四数相加 II
    1.简述:给你四个整数数组 nums1、nums2、nums3 和 nums4 ,数组长度都是 n ,请你计算有多少个元组 (i,j,k,l) 能满足:0<=i,j,k,l<nnums1[i]+nums2[j]+nums3[k]+nums4[l]==0 示例1:输入:nums1=[1,2],nums2=[-2,-1],nums3=[-1,2],nums4=[0,2]输出:2......
  • LeetCode59. 螺旋矩阵Ⅱ
    题目描述给你一个正整数n,生成一个包含1到n2所有元素,且元素按顺时针顺序螺旋排列的nxn正方形矩阵matrix。示例提交的代码classSolution{intmatrixLen=0;publicint[][]generateMatrix(intn){ //初始化空数组int[][]matrix=newint[n][......
  • leetcode2845. 统计趣味子数组的数目
    题解classSolution{public:longlongcountInterestingSubarrays(vector<int>&nums,intmodulo,intk){inta[100010];unordered_map<int,int>mp;mp[0]=1;longlongans=0;intpre=0;......
  • LeetCode Day04 24&19&02.07&142
    24. 两两交换链表中的节点这题使用虚拟头结点会更好做,因为有虚拟头结点我们交换结点的时候步骤会更加清晰。操作此类有指针类型的题目要注意:1.画图避免混乱2.注意指针先后顺序classSolution{publicListNodeswapPairs(ListNodehead){ListNodedumyhea......