数学
973. 最接近原点的 K 个点
题目
给定一个数组
points
,其中points[i] = [x(i), y(i)]
表示 X-Y 平面上的一个点,并且是一个整数k
,返回离原点(0,0)
最近的k
个点。
这里,平面上两点之间的距离是 欧几里德距离(√(x(1) - x(2))(2) + (y(1) - y(2))(2)
)。
你可以按 任何顺序 返回答案。除了点坐标的顺序之外,答案 确保 是 唯一 的。示例 1:
输入: points = [[1,3],[-2,2]], k = 1 输出: [[-2,2]] 解释: (1, 3) 和原点之间的距离为 sqrt(10), (-2, 2) 和原点之间的距离为 sqrt(8), 由于 sqrt(8) < sqrt(10),(-2, 2) 离原点更近。 我们只需要距离原点最近的 K = 1 个点,所以答案就是 [[-2,2]]。
示例 2:
输入: points = [[3,3],[5,-1],[-2,4]], k = 2 输出: [[3,3],[-2,4]] (答案 [[-2,4],[3,3]] 也会被接受。)提示:
1 <= k <= points.length <= 10(4)
-10(4) < x(i), y(i) < 10(4)
题解
/**
* @param {number[][]} points
* @param {number} K
* @return {number[][]}
*/
var kClosest = function (points, K) {
let arr = [];
for (var i = 0; i < points.length; i++) {
let temp = points[i];
arr.push({
id: Math.sqrt(
Math.pow(Math.abs(temp[0]), 2) + Math.pow(Math.abs(temp[1]), 2)
),
item: temp,
});
}
return arr
.sort((a, b) => {
return a.id - b.id;
})
.map((item) => item.item)
.slice(0, K);
};
1103. 分糖果 II
题目
排排坐,分糖果。
我们买了一些糖果candies
,打算把它们分给排好队的n = num_people
个小朋友。
给第一个小朋友 1 颗糖果,第二个小朋友 2 颗,依此类推,直到给最后一个小朋友n
颗糖果。
然后,我们再回到队伍的起点,给第一个小朋友n + 1
颗糖果,第二个小朋友n + 2
颗,依此类推,直到给最后一个小朋友2 * n
颗糖果。
重复上述过程(每次都比上一次多给出一颗糖果,当到达队伍终点后再次从队伍起点开始),直到我们分完所有的糖果。注意,就算我们手中的剩下糖果数不够(不比前一次发出的糖果多),这些糖果也会全部发给当前的小朋友。
返回一个长度为num_people
、元素之和为candies
的数组,以表示糖果的最终分发情况(即ans[i]
表示第i
个小朋友分到的糖果数)。示例 1:
输入: candies = 7, num_people = 4 输出: [1,2,3,1] 解释: 第一次,ans[0] += 1,数组变为 [1,0,0,0]。 第二次,ans[1] += 2,数组变为 [1,2,0,0]。 第三次,ans[2] += 3,数组变为 [1,2,3,0]。 第四次,ans[3] += 1(因为此时只剩下 1 颗糖果),最终数组变为 [1,2,3,1]。
示例 2:
输入: candies = 10, num_people = 3 输出: [5,2,3] 解释: 第一次,ans[0] += 1,数组变为 [1,0,0]。 第二次,ans[1] += 2,数组变为 [1,2,0]。 第三次,ans[2] += 3,数组变为 [1,2,3]。 第四次,ans[0] += 4,最终数组变为 [5,2,3]。提示:
1 <= candies <= 10^9
1 <= num_people <= 1000
题解
/**
* @param {number} candies
* @param {number} num_people
* @return {number[]}
*/
var distributeCandies = function (candies, num_people) {
if (num_people <= 0) return [];
const arr = new Array(num_people).fill(0);
let i = 0,
num = 1,
new_candies = candies;
while (new_candies > 0) {
new_candies -= num;
i = i % num_people;
arr[i] += new_candies > 0 ? num : num + new_candies;
num++;
i++;
}
return arr;
};
3190. 使所有元素都可以被 3 整除的最少操作数
题目
给你一个整数数组
nums
。一次操作中,你可以将nums
中的 任意 一个元素增加或者减少 1 。
请你返回将nums
中所有元素都可以被 3 整除的 最少 操作次数。示例 1:
输入: nums = [1,2,3,4]
输出: 3
解释:
通过以下 3 个操作,数组中的所有元素都可以被 3 整除:
将 1 减少 1 。
将 2 增加 1 。
将 4 减少 1 。
示例 2:
输入: nums = [3,6,9]
输出: 0提示:
1 <= nums.length <= 50
1 <= nums[i] <= 50
题解
/**
* @param {number[]} nums
* @return {number}
*/
var minimumOperations = function (nums) {
return nums.reduce((total, cur) => {
return total + (cur % 3 ? 1 : 0);
}, 0)
};