Skip to content

Latest commit

 

History

History
50 lines (40 loc) · 1.51 KB

File metadata and controls

50 lines (40 loc) · 1.51 KB

891. 子序列宽度之和

一个序列的 宽度 定义为该序列中最大元素和最小元素的差值。

给你一个整数数组 nums ,返回 nums 的所有非空 子序列宽度之和 。由于答案可能非常大,请返回对 109 + 7 取余 后的结果。

子序列 定义为从一个数组里删除一些(或者不删除)元素,但不改变剩下元素的顺序得到的数组。例如,[3,6,2,7] 就是数组 [0,3,1,6,2,2,7] 的一个子序列。

示例 1:

输入: nums = [2,1,3]
输出: 6
解释: 子序列为 [1], [2], [3], [2,1], [2,3], [1,3], [2,1,3] 。
相应的宽度是 0, 0, 0, 1, 1, 2, 2 。
宽度之和是 6 。

示例 2:

输入: nums = [2]
输出: 0

提示:

  • 1 <= nums.length <= 105
  • 1 <= nums[i] <= 105

题解 (Rust)

1. 题解

impl Solution {
    pub fn sum_subseq_widths(mut nums: Vec<i32>) -> i32 {
        let mut x = 0;
        let mut pow2 = 1;
        let mut pow2_sum = 1;
        let mut ret = 0;

        nums.sort_unstable();

        for i in 1..nums.len() {
            x = (2 * x + (nums[i] - nums[i - 1]) as i64 * pow2_sum) % 1_000_000_007;
            pow2 = (2 * pow2) % 1_000_000_007;
            pow2_sum = (pow2_sum + pow2) % 1_000_000_007;
            ret = (ret + x) % 1_000_000_007;
        }

        ret as i32
    }
}