首页 > 其他分享 >二刷Leetcode-Days07

二刷Leetcode-Days07

时间:2023-05-24 12:55:32浏览次数:87  
标签:return int nums1 stack Days07 二刷 dp Leetcode nums2

动规:

    /**
     * 70. 爬楼梯
     * @param n
     * @return
     */
    public int climbStairs(int n) {
        if (n <= 2) {
            return n;
        }
        int[] dp = new int[n];
        dp[0] = 1;
        dp[1] = 2;
        for (int i = 2; i < n; i++) {
            // n 阶可以拆成最小子问题 n-1 阶和 n-2 阶
            // 每一步只能走1阶或2阶,所以3阶的走法可以看成是:1阶走2步 + 2阶走1步,可以理解为 => 当前状态只与前两个状态有关
            dp[i] = dp[i - 1] + dp[i - 2];
        }
        return dp[n - 1];
    }
    /**
     * 746. 使用最小花费爬楼梯
     * @param cost
     * @return
     */
    public static int minCostClimbingStairs(int[] cost) {
        // 1、dp[] 表示走到当前台阶需要花费的最小费用
        int[] dp = new int[cost.length + 1];
        // 3、可以选择从下标为 0 或 1 开始爬,开始爬不支付费用
        dp[0] = 0;
        dp[1] = 0;
        // 2、dp[i] 显然和前两个状态有关,取前两个状态值的最小值,这里要注意费用的计算是以离开时算的
        for (int i = 2; i <= cost.length; i++) {
            // dp[i-1] 和 cost[i-1] 相关,dp[i-2]和cost[i-2]相关
            // 因为只有离开某一台阶后才计算它的费用,仅仅落在上面不计算,题目里也是这个意思
            dp[i] = Math.min(dp[i - 2] + cost[i - 2], dp[i - 1] + cost[i - 1]);
        }
        return dp[cost.length];
    }
    /**
     * 496. 下一个更大元素 I
     *
     * @param nums1
     * @param nums2
     * @return 没有重复元素的两个数组
     */
    public static int[] nextGreaterElement(int[] nums1, int[] nums2) {
        int[] res = new int[nums1.length];
        Arrays.fill(res, -1);
        // 先用 map 存储目标数组的值
        HashMap<Integer, Integer> hashMap = new HashMap<>();
        for (int i = 0; i < nums1.length; i++) {
            hashMap.put(nums1[i], i);
        }
        // 单调栈找出 nums2 的值
        Stack<Integer> stack = new Stack<>();
        stack.push(0);
        for (int i = 1; i < nums2.length; i++) {
            if (nums2[i] > nums2[stack.peek()]) {
                while (!stack.isEmpty() && nums2[i] > nums2[stack.peek()]) {
                    if (hashMap.containsKey(nums2[stack.peek()])){
                        Integer index = hashMap.get(nums2[stack.peek()]);
                        res[index] = nums2[i];
                    }
                    stack.pop();
                }
            }
            stack.add(i);
        }
        return res;
    }

 

标签:return,int,nums1,stack,Days07,二刷,dp,Leetcode,nums2
From: https://www.cnblogs.com/LinxhzZ/p/17427964.html

相关文章

  • LeetCode 62.不同路径
    1.题目:一个机器人位于一个mxn 网格的左上角(起始点在下图中标记为“Start”)。机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角(在下图中标记为“Finish”)。问总共有多少条不同的路径?示例1:输入:m=3,n=7输出:28来源:力扣(LeetCode)链接:https://leetcode.c......
  • leetcode2215哈希列表的应用
    哈希列表存储的是不重复的元素,使用两个哈希列表存储这两个数组。再遍历其中一个哈希列表,查看是否存在另一个哈希列表中set.insert()set1.count(元素)for(intnum:nums1){set1.insert(num);}for(intnum:set1){if(!set2.count(num)){res[0].push_back(num);......
  • bst中序-leetcode230二叉搜索树第k个元素
    给定一个二叉搜索树的根节点 root ,和一个整数 k ,请你设计一个算法查找其中第 k 个最小元素(从1开始计数)。示例1:输入:root=[3,1,4,null,2],k=1输出:1示例2:输入:root=[5,3,6,2,4,null,null,1],k=3输出:3提示:树中的节点数为 n 。1<=k<=n<=1040<=Node.val<......
  • 图解LeetCode——793. 阶乘函数后 K 个零(难度:困难)
    一、题目 f(x) 是 x! 末尾是0的数量。回想一下 x!=1*2*3*...*x,且0!=1 。例如, f(3)=0 ,因为3!=6的末尾没有0;而f(11)=2 ,因为11!=39916800末端有2个0。给定 k,找出返回能满足f(x)=k 的非负整数x 的数量。二、示例2.1>示例1:【输入......
  • 图解LeetCode——剑指 Offer 34. 二叉树中和为某一值的路径
    一、题目给你二叉树的根节点root和一个整数目标和targetSum,找出所有从根节点到叶子节点路径总和等于给定目标和的路径。叶子节点是指没有子节点的节点。二、示例2.1>示例1:【输入】root=[5,4,8,11,null,13,4,7,2,null,null,5,1],targetSum=22【输出】[[5,4,11,2],[5,......
  • 图解LeetCode——662. 二叉树最大宽度(难度:中等)
    一、题目给你一棵二叉树的根节点root,返回树的最大宽度。树的最大宽度是所有层中最大的宽度。每一层的宽度被定义为该层最左和最右的非空节点(即,两个端点)之间的长度。将这个二叉树视作与满二叉树结构相同,两端点间会出现一些延伸到这一层的null节点,这些null节点也计入长......
  • 图解LeetCode——658. 找到 K 个最接近的元素(难度:中等)
    一、题目给定一个排序好的数组 arr,两个整数k和x,从数组中找到最靠近x(两数之差最小)的k个数。返回的结果必须要是按升序排好的。整数a比整数b更接近x需要满足:|a-x|<|b-x|或者|a-x|==|b-x|且a<b二、示例2.1>示例1:【输入】arr=[1,2,3,4,5],k=......
  • 图解LeetCode——剑指 Offer 36. 二叉搜索树与双向链表
    一、题目输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的循环双向链表。要求不能创建任何新的节点,只能调整树中节点指针的指向。二、示例为了让您更好地理解问题,以下面的二叉搜索树为例:我们希望将这个二叉搜索树转化为双向循环链表。链表中的每个节点都有一个前驱和后继指针。对......
  • 图解LeetCode——782. 变为棋盘(难度:困难)
    一、题目一个 n*n 的二维网络 board 仅由 0 和 1 组成 。每次移动,你能任意交换两列或是两行的位置。返回将这个矩阵变为 “棋盘”  所需的最小移动次数 。如果不存在可行的变换,输出-1。“棋盘”是指任意一格的上下左右四个方向的值均与本身不同的矩阵。二、示例......
  • 图解LeetCode——1460. 通过翻转子数组使两个数组相等(难度:简单)
    一、题目给你两个长度相同的整数数组 target 和 arr 。每一步中,你可以选择 arr 的任意非空子数组 并将它翻转。你可以执行此过程任意次。如果你能让arr 变得与target 相同,返回True;否则,返回False。二、示例2.1>示例1:【输入】target=[1,2,3,4],arr=[2,4,1,3]......