子序列宽度求和 Sum of Subsequence Widths
2019-10-14 17:00:10
问题描述:
问题求解:
如果暴力求解,时间复杂度是exponational的,因为这里是子序列而不是子数组。显然,直接枚举子序列是不太现实的了,那么可以怎么做呢?
切入点有两点:
1)数组的顺序对最后的结果是没有影响的,那么排序后的数组和原来的数组的结果是同样的,我们可以对原数组进行排序操作降低问题复杂性。
2)既然直接考虑序列的方案是不可行的,那么还有个思路就是去考虑每个数对最后结果的贡献。如果能想到这一点的话,其实本题就已经基本解决了,考虑到排序好的数组里的每一个数字,只有当它在最左端/最右端的时候才会对最后的结果产生贡献,我们只需要去计算每个数字出现的最左端和最右端的次数即可。而这个其实就是根据idx的一次全排列。
这里还有个需要注意的地方就是最后的数字会很大,所以题目中要求要对1e9 + 7取余数,在做取余操作的时候,我们不能够直接res += (***)% mod,必须使用 res = (res + ***) % mod,另外在最后的结果上为了避免出现负数的情况,需要再加上mod进行取余来规避掉负数的情况。
public int sumSubseqWidths(int[] A) {
long res = 0;
int n = A.length;
int mod = (int)1e9 + 7;
long[] dp = new long[n];
dp[0] = 1;
for (int i = 1; i < n; i++) {
dp[i] = (dp[i - 1] << 1) % mod;
}
Arrays.sort(A);
for (int i = 0; i < n; i++) {
// 不能使用 res += ***
res = (res + A[i] * dp[i] - A[i] * dp[n - i - 1]) % mod;
}
return (int)((res + mod) % mod);
}
子序列宽度求和 Sum of Subsequence Widths的更多相关文章
- [Swift]LeetCode891. 子序列宽度之和 | Sum of Subsequence Widths
Given an array of integers A, consider all non-empty subsequences of A. For any sequence S, let the ...
- [LeetCode] 891. Sum of Subsequence Widths 子序列宽度之和
Given an array of integers A, consider all non-empty subsequences of A. For any sequence S, let the ...
- Sum of Subsequence Widths LT891
Given an array of integers A, consider all non-empty subsequences of A. For any sequence S, let the ...
- 891. Sum of Subsequence Widths
Given an array of integers A, consider all non-empty subsequences of A. For any sequence S, let the ...
- 【leetcode】891. Sum of Subsequence Widths
题目如下: 解题思路:题目定义的子序列宽度是最大值和最小值的差,因此可以忽略中间值.首先对数组排序,对于数组中任意一个元素,都可以成为子序列中的最大值和最小值而存在.例如数组[1,2,3,4,5,6] ...
- [HEOI2016]求和 sum
[HEOI2016]求和 sum 标签: NTT cdq分治 多项式求逆 第二类斯特林数 Description 求\[\sum_{i=0}^n\sum_{j=0}^i S(i,j)×2^j×(j!) ...
- HDU 1231 最大连续子序列 &&HDU 1003Max Sum (区间dp问题)
C - 最大连续子序列 Time Limit:1000MS Memory Limit:32768KB 64bit IO Format:%I64d & %I64u Submit ...
- 寻找最大连续子序列/Find the max contiguous subsequence
寻找最大连续子序列 给定一个实数序列X1,X2,...Xn(不需要是正数),寻找一个(连续的)子序列Xi,Xi+1,...Xj,使得其数值之和在所有的连续子序列数值之和中为最大. 一般称这个子序列为最 ...
- 水晶报表分组,统计,求和,sum()函数使用
--Sum()函数统计的是明细所有的和 Sum(字段名) --根据分组字段统计的和 Sum ({xh_Getdinggoudan;1.Djine} ,{xh_Getdinggoudan;1.Ddgda ...
随机推荐
- 4K手机能拯救索尼手机吗?
智能手机屏幕分辨率究竟达到多少才是极限,一直是业内争论不休的问题.从低分辨率一路走来,直到iPhone 4搭载视网膜屏,业内才有了一个较为统一的认知:屏幕起码要在合适距离下看不到文字.图像虚影,才称得 ...
- (转)Linux设备驱动之HID驱动 源码分析
//Linux设备驱动之HID驱动 源码分析 http://blog.chinaunix.net/uid-20543183-id-1930836.html HID是Human Interface De ...
- QIs for Spread
玩了好几天,看了好多剧,所以这几天的进度稍微有点慢,另外,<一起同过窗>真香! 延展特性涉及解集覆盖的区域.一个具有良好分布的解集应该包含来自PF每个部分的解集,而不遗漏任何区域.然而,大 ...
- flask 返回json数据
ret={ 'a':1 } return jsonify(ret) 不能直接返回ret,应该用jsonify().这样返回的Content-Type: application/json;charset ...
- js操作复选框
js操作复选框 JavaScript 代码: //复选框全选 $(function () { $("#select_all").click(function () { $(&quo ...
- unittest实战(二):用例编写
# coding:utf-8import unittestfrom selenium import webdriverimport timefrom ddt import ddt, data, unp ...
- 从0开始学Git——Git的常用配置
配置user信息 配置user.name和user.email git config --global user.name 'admin' #设置用户名 git config --global use ...
- 7-12 产生每位数字相同的n位数 (30 分)
读入2个正整数A和B,1<=A<=9, 1<=B<=10,产生数字AA...A,一共B个A 输入格式: 在一行中输入A和B. 输出格式: 在一行中输出整数AA...A,一共B个 ...
- 7-8 jmu-python-从列表中删除元素 (15 分)
删除列表中所有符合条件的值. 输入格式: 输入n,代表要测试n次.每次测试:首先,输入1行字符串(字符串内的元素使用空格分隔)然后,输入要删除的元素x. 输出格式: 输出删除元素x后的每行字符串.如果 ...
- html建立大众点评页面遇到的问题
大众点评所用知识 HTML.CSS.bootstrap3 遇到的问题 因图片无法对齐 源码:抛弃div改用img后成功对齐 解决后成功对齐 源码: 导航栏文本无法右对齐. 我想到的方法是: div{ ...