通过万岁!!!
- 题目:题目的意思就是给你两个数组,一个是nums,然后里面是无序的数,一个是queries,里面是有序的,需要在无序的里面找最长的子数组,使得子数组的和小于等于queries的第i个值,保存这个最长的子数组长度即可。
- 思路:首先就是要对nums排序,然后对排序的数组进行一个累计,也就是nums[i]=nums[0]+…+nums[i],得到一个新的nums数组。然后二分查找,找nums中第一个比queries[i]大的下标即可。需要注意的是,如果最后一个都没有queries[i]大,那么结果要进行+1的操作。
- 技巧:二分查找
java代码
class Solution {
public int[] answerQueries(int[] nums, int[] queries) {
int m = queries.length;
Arrays.sort(nums);
int sum = nums[0];
for (int i = 1; i < nums.length; i++) {
sum += nums[i];
nums[i] = sum;
}
// 二分查找
for (int i = 0; i < m; i++) {
queries[i] = binarySearch(nums, queries[i]);
}
return queries;
}
public int binarySearch(int[] nums, int target) {
int l = 0, r = nums.length - 1;
while (l < r) {
int mid = l + (r - l) / 2;
if (nums[mid] > target) {
r = mid;
} else {
l = mid + 1;
}
}
if (nums[l] <= target) {
return l + 1;
} else {
return l;
}
}
}
- 总结:题目不是特别难,这个题有点类似求前缀的意思。理解了这一点其实问题就不大了。而且这个也是一个双指针问题。