zoukankan      html  css  js  c++  java
  • [Leetcode Weekly Contest]195

    链接:LeetCode

    [Leetcode]5448. 判断路径是否相交

    给你一个字符串 path,其中(path[i])的值可以是 'N'、'S'、'E' 或者 'W',分别表示向北、向南、向东、向西移动一个单位。
    机器人从二维平面上的原点 (0, 0) 处开始出发,按 path 所指示的路径行走。
    如果路径在任何位置上出现相交的情况,也就是走到之前已经走过的位置,请返回 True ;否则,返回 False 。

    利用集合的性质,每次判断是否在已走过的位置即可。

    class Solution:
        def isPathCrossing(self, path: str) -> bool:
            now = (0,0)
            al_path = set([now])
            for p in path:
                s,t = now
                if p == 'N':
                    s+=1
                elif p == 'S':
                    s-=1
                elif p=='E':
                    t+=1
                else:
                    t-=1
                now = (s,t)
                if now in al_path:return True
                al_path.add(now)
            return False
    

    [Leetcode]5449. 检查数组对是否可以被 k 整除

    给你一个整数数组 arr 和一个整数 k ,其中数组长度是偶数,值为 n 。现在需要把数组恰好分成 n / 2 对,以使每对数字的和都能够被 k 整除。如果存在这样的分法,请返回 True ;否则,返回 False 。

    统计各余数的个数,然后进行配对。当非0余数能够配对时,则说明存在这样的分法,否在不存在。

    import collections
    class Solution:
        def canArrange(self, arr: List[int], k: int) -> bool:
            if sum(arr)%k!=0:
                return False
            arr = [a%k for a in arr]
            counter = collections.Counter(arr)
            for num in counter:
                if num!=0 and counter[num]!=counter[k-num]:
                    return False
            return True
    

    [Leetcode]5450. 满足条件的子序列数目

    给你一个整数数组 nums 和一个整数 target 。请你统计并返回 nums 中能满足其最小元素与最大元素的 和 小于或等于 target 的 非空 子序列的数目。
    由于答案可能很大,请将结果对 10^9 + 7 取余后返回。

    排序加双指针,每次找到以(nums[i])为最小值的子序列数目,以(nums = [3,5,6,7], target = 9)为例,设定左右指针left,right,当3为非空子序列最小值,判断(nums[left]+nums[right])与target关系:

    • (nums[left]+nums[right]>target),说明左右指针值无法构成合理子序列,则right-1,继续寻找;
    • (nums[left]+nums[right]<=target),说明左右指针值可以构成合理子序列,并且最小值为(nums[left])的子序列中可以存在(nums[left+1:right+1])的任一数值,一共有(2**(right-left))种可能。
    class Solution:
        def numSubseq(self, nums: List[int], target: int) -> int:
            nums.sort()
            mod = int(10**9+7)
            res = 0
            l, r = 0, len(nums)-1
            while l<=r:
                if nums[l]+nums[r]>target:
                    r -= 1
                else:
                    res = (res + (1<<(r-l)))%mod
                    l+=1
            return res
    

    [Leetcode]5451. 满足不等式的最大值

    给你一个数组 points 和一个整数 k 。数组中每个元素都表示二维平面上的点的坐标,并按照横坐标 x 的值从小到大排序。也就是说(points[i] = [xi, yi]),并且在 1 <= i < j <= points.length 的前提下, xi < xj 总成立。请你找出 yi + yj + |xi - xj| 的 最大值,其中 |xi - xj| <= k 且 1 <= i < j <= points.length。
    题目测试数据保证至少存在一对能够满足 |xi - xj| <= k 的点。

    单调队列。时间复杂度O(N)

    typedef pair<int, int> PII;
    class Solution {
    public:
        int findMaxValueOfEquation(vector<vector<int>>& points, int k) {
            deque<PII> dq;
            dq.push_back({points[0][0], points[0][1] - points[0][0]});
            int ans = -2e9;
            for(int i = 1; i < points.size(); i ++) {
    
                while (dq.size() && points[i][0] - dq.front().first > k) dq.pop_front();
                if (dq.size()) ans = max(ans, dq.front().second + points[i][0] + points[i][1]);
                while (dq.size() && dq.back().second <= points[i][1] - points[i][0]) dq.pop_back();
                dq.push_back({points[i][0], points[i][1] - points[i][0]});
            }
            return ans;
        }
    };
    

    参考:
    Leetcode

  • 相关阅读:
    P1439 【模板】最长公共子序列
    DP,入门???
    关于Eclipse在servlet中连接数据库时出现驱动加载失败的解决
    JSP学习(JavaBean)
    HTML随笔3
    CSS随笔3
    计算机网络随笔
    基本命令行操作1(java编译)
    Javascript随笔2(JQuery)
    Javascrip随笔1
  • 原文地址:https://www.cnblogs.com/hellojamest/p/13205121.html
Copyright © 2011-2022 走看看