数据结构与算法面试题:给定 n 个非负整数 a1,a2,a3,...,an,每个数代表坐标中的一个点(i, ai),请找出两个点之间的最大距离。(提示:动态规划)

简介: 数据结构与算法面试题:给定 n 个非负整数 a1,a2,a3,...,an,每个数代表坐标中的一个点(i, ai),请找出两个点之间的最大距离。(提示:动态规划)

数据结构与算法面试题:给定 n 个非负整数 a1,a2,a3,…,an,每个数代表坐标中的一个点(i, ai),请找出两个点之间的最大距离。(提示:动态规划

简介:给定 n 个非负整数 a1,a2,a3,…,an,每个数代表坐标中的一个点(i, ai),请找出两个点之间的最大距离。(提示:动态规划)

算法思路

算法实现思路:

  • 使用动态规划的方法进行求解。具体来说,用left[i]表示第i个数左侧最小的数,用right[i]表示第i个数右侧最大的数。初始化left[0] = a[0]和right[n - 1] = a[n - 1]。
  • 遍历数组,求解left和right数组。对于left数组,我们从前往后遍历a数组,更新left[i+1] = min(left[i], a[i+1]);对于right数组,我们从后往前遍历a数组,更新right[i-1] = max(right[i], a[i-1])。
  • 最后遍历数组,计算最大差值maxDiff = max(maxDiff, right[i] - left[i]),其中0 <= i < n。

使用C++代码实现,注释详细:

class Solution {
public:
    int maxDistance(vector<int>& nums) {
        int n = nums.size();
        vector<int> left(n, 0), right(n, 0); // 定义两个数组分别存储对于每个元素i来说的左边最小和右边最大的数
        left[0] = nums[0]; // 初始化,左边最小为nums[0]
        right[n - 1] = nums[n - 1]; // 初始化,右边最大为nums[n-1]
        for (int i = 1; i < n; i++) { // 更新left数组
            left[i] = min(left[i - 1], nums[i]);
        }
        for (int i = n - 2; i >= 0; i--) { // 更新right数组
            right[i] = max(right[i + 1], nums[i]);
        }
        int maxDiff = 0;
        for (int i = 0; i < n; i++) { // 遍历数组,计算左边最小和右边最大之差的最大值
            maxDiff = max(maxDiff, right[i] - left[i]);
        }
        return maxDiff;
    }
};

由于动态规划思路本身简单明了,代码实现也比较简单。关键在于对left和right数组更新方法的理解,这样才能理解所编写代码的含义。

  • java版本
class Solution {
    public int maxDistance(int[] nums) {
        int n = nums.length;
        int[] left = new int[n];
        int[] right = new int[n];
        left[0] = nums[0];
        right[n - 1] = nums[n - 1];
        for (int i = 1; i < n; i++) {
            left[i] = Math.min(left[i - 1], nums[i]);
        }
        for (int i = n - 2; i >= 0; i--) {
            right[i] = Math.max(right[i + 1], nums[i]);
        }
        int maxDiff = 0;
        for (int i = 0; i < n; i++) {
            maxDiff = Math.max(maxDiff, right[i] - left[i]);
        }
        return maxDiff;
    }
}
相关文章
|
1天前
|
存储 缓存 算法
面试遇到算法题:实现LRU缓存
V哥的这个实现的关键在于维护一个双向链表,它可以帮助我们快速地访问、更新和删除最近最少使用的节点,同时使用哈希表来提供快速的查找能力。这样,我们就可以在 O(1) 的时间复杂度内完成所有的缓存操作。哈哈干净利索,回答完毕。
11 1
|
11天前
|
算法
代码随想录算法训练营第五十六天 | LeetCode 647. 回文子串、516. 最长回文子序列、动态规划总结
代码随想录算法训练营第五十六天 | LeetCode 647. 回文子串、516. 最长回文子序列、动态规划总结
31 1
|
18天前
|
算法
算法系列--动态规划--背包问题(5)--二维费用背包问题(下)
算法系列--动态规划--背包问题(5)--二维费用背包问题(下)
14 0
|
18天前
|
算法
算法系列--动态规划--背包问题(5)--二维费用背包问题(上)
算法系列--动态规划--背包问题(5)--二维费用背包问题(上)
19 0
|
18天前
|
算法
算法系列--动态规划--背包问题(4)--完全背包拓展题目(下)
算法系列--动态规划--背包问题(4)--完全背包拓展题目(下)
21 0
|
18天前
|
算法
算法系列--动态规划--背包问题(4)--完全背包拓展题目(上)
算法系列--动态规划--背包问题(4)--完全背包拓展题目(上)
20 0
|
18天前
|
算法
算法系列--动态规划--背包问题(3)--完全背包介绍(下)
算法系列--动态规划--背包问题(3)--完全背包介绍(下)
17 0
|
18天前
|
算法
算法系列--动态规划--背包问题(2)--01背包拓展题目(下)
算法系列--动态规划--背包问题(2)--01背包拓展题目(下)
16 0
算法系列--动态规划--背包问题(2)--01背包拓展题目(下)
|
18天前
|
算法
算法系列--动态规划--背包问题(2)--01背包拓展题目(上)
算法系列--动态规划--背包问题(2)--01背包拓展题目
21 0
|
18天前
|
机器学习/深度学习 算法 C#
算法系列--动态规划--背包问题(1)--01背包介绍(下)
算法系列--动态规划--背包问题(1)--01背包介绍(下)
12 0