Leetcode每日一题:22/05/18~19

Leetcode每日一题:22/05/18~19

22/05/18:乘法表中第k小的数

给定高度m 、宽度n 的一张 m * n的乘法表,以及正整数k,你需要返回表中第k 小的数字。

例 1:

输入: m = 3, n = 3, k = 5输出: 3解释: 乘法表:123246369第5小的数字是 3 (1, 2, 2, 3, 3).

思路:二分查找

  • 考虑每一行中不超过x的个数有几个:min(|x/i|, n)个,因此乘法表总共不超过x的个数即为每一行中的不超过x的个数之和。
  • 对于下列代码中为什么返回的left一定在乘法表中?
    • 首先,乘法表中第k小的数字一定在[left, right]中,即在集合{left, left+1, ..., x, ...right}中。
    • 因为[left, right]最后会收敛于某个点,而由于乘法表中第k小数字一定在[left, right]中,所以该点必是x。
    • 在循环迭代的过程中,left不一定在乘法表中,但是x一定在[left, right]中。循环跳出的条件是left=right, 因此有left=right=x
class Solution {    public int findKthNumber(int m, int n, int k) {        int left = 1, right = m * n;        while (left < right) {            int mid = left + (right - left) / 2;            int temp = 0;            for (int i = 1; i <= m; i++) {                temp += Math.min(mid / i, n);            }            if (temp >= k) {                right = mid;            } else {                left = mid + 1;            }        }        return left;    }}

# 22/05/19:最少移动次数使数组元素相等 II

给你一个长度为 n 的整数数组 nums ,返回使所有数组元素相等需要的最少移动数。在一步操作中,你可以使数组中的一个元素加 1 或者减 1

示例 1:

输入:nums = [1,2,3]输出:2解释:只需要两步操作(每步操作指南使一个元素加 1 或减 1):[1,2,3]  =>  [2,2,3]  =>  [2,2,2]

思路:实际上找到排序数组后的中位数即可。

class Solution {    public int minMoves2(int[] nums) {        Arrays.sort(nums);        int left = 0, right = nums.length - 1;        int mid = left + (right - left) / 2;        int res = 0;        for (; left <= right; left++, right--) {            res += nums[right] - nums[left];        }        return res;    }}
免责声明:本网信息来自于互联网,目的在于传递更多信息,并不代表本网赞同其观点。其原创性以及文中陈述文字和内容未经本站证实,对本文以及其中全部或者部分内容、文字的真实性、完整性、及时性本站不作任何保证或承诺,并请自行核实相关内容。本站不承担此类作品侵权行为的直接责任及连带责任。如若本网有任何内容侵犯您的权益,请及时联系我们,本站将会在24小时内处理完毕。
相关文章
返回顶部