【Day 38】 前缀和专题
题目描述
- 网易面试题
有一个班级有 n 个人,给出 n 个元素,第 i 个元素代表 第 i 位同学的考试成绩,接下进行 m 次询问,每次询问给出一个数值 t ,表示第 t 个同学,然后需要我们输出第 t 个同学的成绩超过班级百分之几的人,百分数 p 可以这样算:p = (不超过第 t 个同学分数的人数 ) / n * 100%。输出的时候保留到小数点后 6 位,并且需要四舍五入。 输入描述:第一行输入两个数 n 和 m,两个数以空格隔开,表示 n 个同学和 m 次询问。第二行输入 n 个数值 ni,表示每个同学的分数,第三行输入 m 个数值mi,表示每次询问是询问第几个同学。(注意,这里 2<=n,m<=100000,0<=ni<=150,1<=mi<=n) 输出描述:输出 m 行,每一行输出一个百分数 p,代表超过班级百分之几的人。 示例1: 输入 : 3 2 50 60 70 1 2 输出 33.333333% 66.666667%其他:
- 308
- 525
- 1139
- 1176
- 1182
- 1277
- 1292
- 1314
- 1504
我的回答
解法一
时空复杂度
var subarraySum = function (nums, k) {
let count = 0
for (let i = 0; i < nums.length; i++) {
let sum = 0
for (let j = i; j < nums.length; j++) {
sum += nums[j]
if (sum == k) count++
}
}
return count
};解法二
var subarraySum = function (nums, k) {
const hashmap = {};
let acc = 0;
let count = 0;
for (let i = 0; i < nums.length; i++) {
acc += nums[i]
if (acc == k) count++
if (hashmap[acc - k]) count += hashmap[acc - k]
hashmap[acc] = hashmap[acc] ? hashmap[acc] + 1 : 1
}
return count;
};