LeetCode第377场周赛总结

发布于 2023-12-24  983 次阅读


AI 摘要

LeetCode第377场周赛总结: 在本场周赛中,我参加了第一场。不过,我只解决了第一题,对第二题的思路太过自信了。下面是我解决这两个题目的代码: 第一题:"最小数字游戏" ```java class Solution { public int[] numberGame(int[] nums) { Stack stack = new Stack<>(); int[] array = new int[nums.length]; Integer[] integers = Arrays.stream(nums).boxed().toArray(Integer[]::new); Arrays.sort(integers, Collections.reverseOrder()); nums = Arrays.stream(integers).mapToInt(Integer::valueOf).toArray(); for (int i = 0; i < array.length; i = i+2) { if(i + 1 < array.length) stack.push(nums[i+1]); stack.push(nums[i]); } for (int i = 0; i < array.length; i++) { array[i] = stack.pop(); } return array; } } ``` 第二题:"移除栅栏得到的正方形田地的最大面积" ```java class Solution { public int maximizeSquareArea(int m, int n, int[] hFences, int[] vFences) { if(m-1 == n-1){ return (n-1) * (n-1) % 1000000007; } Arrays.sort(hFences); Arrays.sort(vFences); Set setH = new HashSet<>(); Set setV = new HashSet<>(); setH.add(m-1); setV.add(n-1); for(int i = 0; i

参加的第一场周赛

尴尬,只AC了第一题

第二题的太想当然了。

这两题的代码

100148. 最小数字游戏

    class Solution {
        public int[] numberGame(int[] nums) {
            Stack<Integer> stack = new Stack<>();
            int[] array = new int[nums.length];
            Integer[] integers = Arrays.stream(nums).boxed().toArray(Integer[]::new);
            Arrays.sort(integers, Collections.reverseOrder());
            nums = Arrays.stream(integers).mapToInt(Integer::valueOf).toArray();
            for (int i = 0; i < array.length; i = i+2) {
                if(i + 1 < array.length)
                    stack.push(nums[i+1]);
                stack.push(nums[i]);
            }
            // 打印栈中的元素
            for (int i = 0; i < array.length; i++) {
                array[i] = stack.pop();
            }
            return array;
        }
    }

100169. 移除栅栏得到的正方形田地的最大面积

    class Solution {
        public int maximizeSquareArea(int m, int n, int[] hFences, int[] vFences) {
            //1. 通过hFences 与 vFences构建出可能的边长
            if(m-1 == n-1){
                return (n-1) * (n-1) % 1000000007;
            }
            Arrays.sort(hFences);
            Arrays.sort(vFences);
            Set<Integer> setH = new HashSet<Integer>();
            Set<Integer> setV = new HashSet<Integer>();
            setH.add(m-1);
            setV.add(n-1);
            for(int i = 0; i<hFences.length; i++){
                int left = hFences[i] -1;
                int right = m - hFences[i];
                setH.add(left);
                setH.add(right);
                for(int j = i+1; j<hFences.length; j++){
                    int len = hFences[j] - hFences[i];
                    setH.add(len);
                }
            }



            for(int i = 0; i<vFences.length; i++){
                int left = vFences[i] -1;
                int right = n - vFences[i];
                setV.add(left);
                setV.add(right);
                for(int j = i+1; j<vFences.length; j++){
                    int len = vFences[j] - vFences[i];
                    setV.add(len);
                }
            }

            // 获取边的交集
            setH.retainAll(setV);
            if(setH.isEmpty()){
                return -1;
            }
            else{
                long res = 1;
                for(int num : setH){
                    res = Math.max(res, num);
                }
                return (int)(res*res%1000000007);
            }

        }
    }

总的来说就是哈希Set不熟悉,如果想到把边分成三段就好

第一段是1,点,然后点到点。然后点到边长

从此分成三段,然后把长宽的值都纳入哈希Set

再在长宽的哈希表setH.retainAll(setV);,可以获取哈希的交集,从而找出是否存在正方形。