day-08-496/1232/503-代码小白不配做栈!!!-单调栈

56 阅读1分钟

第一题-因为这道题,临时调整计划,最后变成一道这种类型题

题目

nums1 中数字 x 的 下一个更大元素 是指 x 在 nums2 中对应位置 右侧 的 第一个 比 x ****大的元素。

给你两个 没有重复元素 的数组 nums1 和 nums2 ,下标从 0 开始计数,其中nums1 是 nums2 的子集。

对于每个 0 <= i < nums1.length ,找出满足 nums1[i] == nums2[j] 的下标 j ,并且在 nums2 确定 nums2[j] 的 下一个更大元素 。如果不存在下一个更大元素,那么本次查询的答案是 -1 。

返回一个长度为 nums1.length 的数组 **ans **作为答案,满足 **ans[i] **是如上所述的 下一个更大元素

示例:

输入: nums1 = [2,4], nums2 = [1,2,3,4].
输出: [3,-1]
解释: nums1 中每个值的下一个更大元素如下所述:
- 2 ,用加粗斜体标识,nums2 = [1,2,3,4]。下一个更大元素是 3 。
- 4 ,用加粗斜体标识,nums2 = [1,2,3,4]。不存在下一个更大元素,所以答案是 -1

思路

1、暴力破解:遍历num1数组,然后循环num2数组查找num1[i],找到后向后继续向后遍历,找到大于num[i]的num2[j],找到就直接返回num2[j]的值塞进新的数组里,找不到返回-1塞进去-------不写了

代码小白,不配做栈、队列、数组、链表和红黑树啥的数据结构的题,臣妾做不到啊!!!!!下面是参考官方题解(一口老血喷出来,这是简单题)看个简单题还要看单调栈算法,喔!

image.png

代码

    public int[] nextGreaterElement(int[] nums1, int[] nums2) {
        Map<Integer, Integer> map = new HashMap<Integer, Integer>();
        Deque<Integer> stack = new ArrayDeque<Integer>();
        for (int i = nums2.length - 1; i >= 0; --i) {
            int num = nums2[i];
            while (!stack.isEmpty() && num >= stack.peek()) {
                stack.pop();
            }
            map.put(num, stack.isEmpty() ? -1 : stack.peek());
            stack.push(num);
        }
        int[] res = new int[nums1.length];
        for (int i = 0; i < nums1.length; ++i) {
            res[i] = map.get(nums1[i]);
        }
        return res;
    }

代码释义

我真的,这就是题解放在我眼前,我都不知道啥意思的那种,最终,走一遍代码,然后才理解的,不上释义了,直接写个自己走的路程吧

image.png

第二题

题目

给定一个数组 coordinates ,其中 coordinates[i] = [x, y] , [x, y] 表示横坐标为 x、纵坐标为 y 的点。请你来判断,这些点是否在该坐标系中属于同一条直线上

思路

判断斜率是否一直相等就可以了,注意计算斜率的时候,不要忘记分母不能为0,单拎出来

代码

    public boolean checkStraightLine(int[][] coordinates) {
        boolean res = true;
        int num1 = coordinates[0][0];
        int num2 = coordinates[0][1];
        int num3 = coordinates[1][0];
        int num4 = coordinates[1][1];
        if(num3 - num1 == 0) {
            for(int i = 2; i < coordinates.length; i++) {
                if(coordinates[i][0] - num1 != 0) {
                    res = false;
                    break;
                };  
            }
        }else {
            double k = (double)((double)(num4 - num2)/(double)(num3-num1));
            for(int i = 2; i < coordinates.length; i++) {
                if((double)((double)(coordinates[i][1] - num2) / (double)(coordinates[i][0] - num1)) != k) {
                    res = false;
                    break;
                }
            }
        }
        return res;
    }

附加题

题目

给定一个循环数组 nums ( nums[nums.length - 1] 的下一个元素是 nums[0] ),返回 nums 中每个元素的 下一个更大元素 。

数字 x 的 下一个更大的元素 是按数组遍历顺序,这个数字之后的第一个比它更大的数,这意味着你应该循环地搜索它的下一个更大的数。如果不存在,则输出 -1

思路

竟然还加了个循环数组,我觉得我不配啊~

别问我怎么想出来的,我也不知道我怎么想出来的,我是试出来的,(要是别人这么告诉我也不信)

做的时候,感觉,啊,这!从哪开始循环啊,怎么判断啊,可能就是因为加了循环数组,所以,这道题是中等难度,我还是保留题目一的思想,比较难思考的就是循环的问题。

代码

    public int[] nextGreaterElements(int[] nums) {
        if(nums.length == 1) {return new int[]{-1};};
        Map<Integer, Integer> map = new HashMap<Integer, Integer>();
        Deque<Integer> stack = new ArrayDeque<Integer>();
        int i = (nums.length -1) * 2;
        while(-1 < i && i < (nums.length -1) * 2 + 1) {
            int num = (i >= nums.length ? nums[i - nums.length] : nums[i]);
            while (!stack.isEmpty() && num >= stack.peek()) {
                stack.pop();
            }
            map.put(i >= nums.length ? i - nums.length : i, stack.isEmpty() ? -1 : stack.peek());
            stack.push(num);
            i--;
        }
        int[] res = new int[nums.length];
        for (int j = 0; j < nums.length; ++j) {
            res[j] = map.get(j);
        }
        return res;
    }