【每日一题】Leetcode - 面试题 17.08. Circus Tower LCCI

这篇具有很好参考价值的文章主要介绍了【每日一题】Leetcode - 面试题 17.08. Circus Tower LCCI。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

Question

Leetcode - 面试题 17.08. Circus Tower LCCI

Train of thought

Sorting heights to be ascending order and weights to be descending order. dp[i] = j represents person[i] as the bottom of tower, the tower height is amount of j, to calculate the dp[i] we find the maximum of dp[0 ~ (i-1)] what the person[0 ~ (i-1)] shorter and lighter than person[i], increase it of one, it’s the dp[i] result.

class Solution {

    public int bestSeqAtIndex(int[] height, int[] weight) {
        int[][] persons = new int[height.length][2];
        for (int i = 0; i < height.length; i++) {
            persons[i][0] = height[i];
            persons[i][1] = weight[i];
        }
        Arrays.sort(persons, (a, b) -> {
            if (a[0] == b[0]) {
                return b[1] - a[1];
            }
            return a[0] - b[0];
        });
        int[] dp = new int[persons.length];
        Arrays.fill(dp, 1);
        int max = 1;
        for (int i = 1; i < persons.length; i++) {
            for (int j = i - 1; j >= 0; j--) {
                if (persons[j][1] < persons[i][1]) {
                    if (dp[j] + 1 > dp[i]) {
                        dp[i] = dp[j] + 1;
                    }
                }
            }
            if (dp[i] > max) {
                max = dp[i];
            }
        }
        return max;
    }

}

【每日一题】Leetcode - 面试题 17.08. Circus Tower LCCI,每日一题,leetcode,算法,二分搜索,java,动态规划

Optimize

We can optimize the follow code, make it time complexity from O(n) to O(logn):

	for (int j = i - 1; j >= 0; j--) {
       if (persons[j][1] < persons[i][1]) {
            if (dp[j] + 1 > dp[i]) {
                dp[i] = dp[j] + 1;
            }
        }
    }
    if (dp[i] > max) {
        max = dp[i];
    }
    
//-------------------- TO BE ------------------

	 left = 0; right = len;
     while (left < right) {
         mid = (left + right) / 2;
         if (top[mid] > persons[i][1]) {
             right = mid;
         }
         else if (top[mid] < persons[i][1]) {
             left = mid + 1;
         }
         else {
             right = mid;
         }
     }
     if (left == len) {
         len++;
     }
     top[left] = persons[i][1];

Following is the complete code

class Solution {

    public int bestSeqAtIndex(int[] height, int[] weight) {
        int[][] persons = new int[height.length][2];
        for (int i = 0; i < height.length; i++) {
            persons[i][0] = height[i];
            persons[i][1] = weight[i];
        }
        Arrays.sort(persons, (a, b) -> {
            if (a[0] == b[0]) {
                //  using descending order to avoid choice twice person of the weights are equals,
                //      the principle is because of we choice the continuous top is ascending order
                //      and the heap is descending order, it can covered the ahead
                return b[1] - a[1];
            }
            return a[0] - b[0];
        });
        int[] top = new int[persons.length];
        int len = 0, left, right, mid;
        for (int i = 0; i < persons.length; i++) {
            left = 0; right = len;
            while (left < right) {
                mid = (left + right) / 2;
                if (top[mid] > persons[i][1]) {
                    right = mid;
                }
                else if (top[mid] < persons[i][1]) {
                    left = mid + 1;
                }
                else {
                    right = mid;
                }
            }
            if (left == len) {
                len++;
            }
            top[left] = persons[i][1];
        }
        return len;
    }

}

【每日一题】Leetcode - 面试题 17.08. Circus Tower LCCI,每日一题,leetcode,算法,二分搜索,java,动态规划文章来源地址https://www.toymoban.com/news/detail-535503.html

到了这里,关于【每日一题】Leetcode - 面试题 17.08. Circus Tower LCCI的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 2023-07-08 LeetCode每日一题(三数之和)

    点击跳转到题目位置 给你一个整数数组 nums ,判断是否存在三元组 [nums[i], nums[j], nums[k]] 满足 i != j、i != k 且 j != k ,同时还满足 nums[i] + nums[j] + nums[k] == 0 。请 你返回所有和为 0 且不重复的三元组。 **注意:**答案中不可以包含重复的三元组。 提示: 3 = nums.length = 3000 -10 5

    2024年02月13日
    浏览(40)
  • 2023-08-13 LeetCode每日一题(合并两个有序数组)

    点击跳转到题目位置 给你两个按 非递减顺序 排列的整数数组 nums1 和 nums2,另有两个整数 m 和 n ,分别表示 nums1 和 nums2 中的元素数目。 请你 合并 nums2 到 nums1 中,使合并后的数组同样按 非递减顺序 排列。 **注意:**最终,合并后数组不应由函数返回,而是存储在数组 num

    2024年02月13日
    浏览(47)
  • 2023-09-08 LeetCode每日一题(计算列车到站时间)

    点击跳转到题目位置 给你一个正整数 arrivalTime 表示列车正点到站的时间(单位:小时),另给你一个正整数 delayedTime 表示列车延误的小时数。 返回列车实际到站的时间。 注意,该问题中的时间采用 24 小时制。 示例 1: 示例 2: 提示: 1 = arrivaltime 24 1 = delayedTime = 24 (1) 运用

    2024年02月09日
    浏览(41)
  • 2023-08-04 LeetCode每日一题(不同路径 III)

    点击跳转到题目位置 在二维网格 grid 上,有 4 种类型的方格: 1 表示起始方格。且只有一个起始方格。 2 表示结束方格,且只有一个结束方格。 0 表示我们可以走过的空方格。 -1 表示我们无法跨越的障碍。 返回在四个方向(上、下、左、右)上行走时,从起始方格到结束方

    2024年02月14日
    浏览(30)
  • 2023-08-10LeetCode每日一题(下降路径最小和 II)

    点击跳转到题目位置 给你一个 n x n 整数矩阵 grid ,请你返回 非零偏移下降路径 数字和的最小值。 非零偏移下降路径 定义为:从 grid 数组中的每一行选择一个数字,且按顺序选出来的数字中,相邻数字不在原数组的同一列。 示例 1: 示例 2: 提示: n == grid.length == grid[i].

    2024年02月13日
    浏览(34)
  • 2023-08-23 LeetCode每日一题(统计点对的数目)

    点击跳转到题目位置 给你一个无向图,无向图由整数 n ,表示图中节点的数目,和 edges 组成,其中 edges[i] = [u i , v i ] 表示 u i 和 v i 之间有一条无向边。同时给你一个代表查询的整数数组 queries 。 第 j 个查询的答案是满足如下条件的点对 (a, b) 的数目: a b cnt 是与 a 或者 b

    2024年02月11日
    浏览(42)
  • 【LeetCode - 每日一题】1654. 到家的最少跳跃次数(23.08.30)

    可以左跳可以右跳 不能连续左跳两次 不能跳到负数 不能跳到 forbidden[] 求可以跳到 x 的最少跳跃次数 a. overview 最初时,只有 0 位置可以进行跳跃;在跳到 a 位置后,又可以跳到 2a 位置和 a-b 位置(如果 ab );然后又多了两个位置(或者一个位置)可以跳跃…因此这是一个

    2024年02月10日
    浏览(31)
  • 2023-08-24 LeetCode每日一题(统计参与通信的服务器)

    点击跳转到题目位置 这里有一幅服务器分布图,服务器的位置标识在 m * n 的整数矩阵网格 grid 中,1 表示单元格上有服务器,0 表示没有。 如果两台服务器位于同一行或者同一列,我们就认为它们之间可以进行通信。 请你统计并返回能够与至少一台其他服务器进行通信的服

    2024年02月10日
    浏览(32)
  • 2023-08-12 LeetCode每日一题(合并 K 个升序链表)

    点击跳转到题目位置 给你一个链表数组,每个链表都已经按升序排列。 请你将所有链表合并到一个升序链表中,返回合并后的链表。 示例 1: 示例 2: 示例 3:

    2024年02月13日
    浏览(31)
  • 【LeetCode - 每日一题】823. 带因子的二叉树 (2023.08.29)

    元素都大于1,元素不重复。 计数满足要求的二叉树(每个非叶结点的值应等于它的两个子结点的值的乘积)的数量。 元素可以重复使用。 自上而下动态规划。 所有元素大于1,所以不会有 自己×自己=自己 的情况; 元素本身就是一棵二叉树,所以将 dp 初始化为全 1; 将数组

    2024年02月10日
    浏览(28)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包