第 195 场力扣周赛题解

5448. 判断路径是否相交

思路:存储下坐标是否访问过即可。

class Solution {
    public boolean isPathCrossing(String path) {

        Map map = new HashMap<>();

        map.put(String.valueOf(0) + "#" + String.valueOf(0), true);

        int x = 0, y = 0, n = path.length();
        for (int i = 0; i < n; i++) {
            if (path.charAt(i) == 'N') x = x - 1;
            else if (path.charAt(i) == 'S') x = x + 1;
            else if (path.charAt(i) == 'E') y = y + 1;
            else y = y - 1;
            String s = String.valueOf(x) + "#" + String.valueOf(y);
            if (map.containsKey(s)) return true;
            map.put(s, true);
        }

        return false;
    }
}

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

思路:存储下元素对k取模的余数出现次数即可,当且仅当两个余数之和为k并且出现的次数相同时才能凑成对。

class Solution {
    public boolean canArrange(int[] arr, int k) {

        int n = arr.length;
        int[] nums = new int[k];

        for (int i = 0; i < n; i++) {
            if(arr[i]<0){
                arr[i]+=Math.abs(arr[i])/k*k;
                while(arr[i]<0) arr[i]+=k;
            }
            nums[arr[i] % k]++;
        }

        if (nums[0] % 2 != 0) return false;

        for (int i = 1; i < k; i++)
            if (nums[i] != nums[k - i])
                return false;

        return true;
    }
}

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

思路:我们可以枚举子序列的最小值,之后通过二分查找能够满足题意的最大的数,则以该最小值产生的贡献一定是以2为底,最大的呢个数的索引减去当前数的索引为幂次的值。

class Solution {

    private int mod = 1000000007;

    public int numSubseq(int[] nums, int target) {

        Arrays.sort(nums);

        int n = nums.length;
        long ans = 0;

        for (int i = 0; i < n; i++) {
            if (nums[i] > target)
                break;
            int l = i, r = n - 1, p = -1;
            while (l <= r) {
                int mid = (l + r) / 2;
                if (nums[i] + nums[mid] <= target) {
                    p = mid;
                    l = mid + 1;
                } else
                    r = mid - 1;
            }

            if (p != -1)
                ans = (ans + Sum(p - i + 1)) % mod;
        }

        return (int)ans;

    }

    private long Sum(int x) {

        return q(2, x - 1) % mod;

    }

    private long q(long x, long y) {
        long res = 1;
        while (y > 0) {
            if (y % 2 == 1)
                res = res * x % mod;
            x = x * x % mod;
            y /= 2;
        }
        return res;
    }
}

5451. 满足不等式的最大值

思路:我们考虑枚举索引j,则我们可以将绝对值去掉,因为xj一定大于xi,问题转化为求yi+yj+xj-xi的最大值,而当前yj和xj是已经确定的,因此我们只需要找到yi-xi的最大值即可,并且要满足xj-xi<=k。我们可以用优先队列完成这件事。

class Solution {
    public int findMaxValueOfEquation(int[][] points, int k) {

        int n = points.length, ans = Integer.MIN_VALUE;
        PriorityQueue q = new PriorityQueue<>((a, b) -> b[0] - a[0]);

        for (int i = 0; i < n; i++) {
            while (!q.isEmpty() && q.peek()[1] + k < points[i][0])
                q.poll();
            if (!q.isEmpty())
                ans = Math.max(ans, q.peek()[0] + points[i][0] + points[i][1]);
            q.add(new int[]{points[i][1] - points[i][0], points[i][0]});
        }

        return ans; 

    }
}

 

你可能感兴趣的:(第 195 场力扣周赛题解)