题目:
代码:
//C语言实现
//比较函数cmp() 降序排序
int cmp(const void *a, const void *b){
return *(int*)b - *(int*)a;
}
int* minSubsequence(int* nums, int numsSize, int* returnSize){
//C语言内置函数qsort实现对nums进行cmp()方式排序
qsort(nums, numsSize, sizeof(int), cmp);
int numsSizeLog = numsSize, numsSum = 0;
//nums求和
while(numsSizeLog--){
numsSum += nums[numsSizeLog];
}
int sum = 0;
int a;//子数列长度
for(int i = 0; i < numsSize; i++){
sum += nums[i];
//当子数列和小于剩余元素的和时成立
if(sum > (numsSum - sum)){
a = i + 1;
break;
}
}
*returnSize = a;
return nums;
}
解题思路:
!!!长度限制优先级高于大小限制优先级!!!
题目描述子序列是一个很难实现的东西(不连续的情况),
为简便,考虑降序排序A = {a0, a1, a2,.....,ai, ..., an} (a0 > a1 > a2 > .... > ai ... > an)
考虑降序是因为题目要求的是“大” -----> 要想子序列尽量短 就必须要子序列包含的元素尽量大
若存在一个子数列A1 = {a0, a1, a2, ..., ai} 满足sum(a) > (sum(A) - sum(a)) 则A2 = { a0, a1, a2, a3, ...., ai, a(i + 1) } 必定满足题目要求
所以 我只要找满足题意的最短的A的子序列即可!