leetcode-数学

数学

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)
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值