查找和最小的k对数字

news/2024/5/20 8:37:27 标签: leetcode, 数据结构,

查找和最小的k对数字

  • 查找和最小的k对数字

查找和最小的k对数字

LeetCode373: 链接:查找和最小的k对数字

题目描述:
373. 查找和最小的K对数字
给定两个以升序排列的整形数组 nums1 和 nums2, 以及一个整数 k。
定义一对值 (u,v),其中第一个元素来自 nums1,第二个元素来自 nums2。
找到和最小的 k 对数字 (u1,v1), (u2,v2) … (uk,vk)。

示例 1:

输入: nums1 = [1,7,11], nums2 = [2,4,6], k = 3
输出: [1,2],[1,4],[1,6]
解释: 返回序列中的前 3 对数:
[1,2],[1,4],[1,6],[7,2],[7,4],[11,2],[7,6],[11,4],[11,6]

示例 2:

输入: nums1 = [1,1,2], nums2 = [1,2,3], k = 2
输出: [1,1],[1,1]
解释: 返回序列中的前 2 对数:
[1,1],[1,1],[1,2],[2,1],[1,2],[2,2],[1,3],[1,3],[2,3]

示例 3:

输入: nums1 = [1,2], nums2 = [3], k = 3
输出: [1,3],[2,3]
解释: 也可能序列中所有的数对都被返回:[1,3],[2,3]

思路:
定义一个比较器,通过两个数的和来比较;
将两个数组,按照排列组合的方式凑成(nums1.length * nums2.length)对,放在ArrayList中。建立一个小,然后将其放在中,然后将前k个最小的从中拿出来。
(当然也可以建k个大小的,然后依次比较后面的元素,是否需要插入中,最后从中取出)。

class Solution {
    static class com implements Comparator<ArrayList<Integer>> {

        @Override
        public int compare(ArrayList<Integer> o1, ArrayList<Integer> o2) {
            int x = o1.get(0) + o1.get(1);
            int y = o2.get(0) + o2.get(1);
            return x - y;
        }
    }

    public List<List<Integer>> kSmallestPairs(int[] nums1, int[] nums2, int k) {
        List<List<Integer>> list = new ArrayList<>();
        for (int i : nums1) {
            for (int e : nums2) {
                List<Integer> row = new ArrayList<>();
                row.add(i);
                row.add(e);
                list.add(row);
            }
        }
        Comparator comparator = new com();
        Queue<List<Integer>> queue = new PriorityQueue<>(comparator);

        for (int i = 0; i < list.size(); i++) {
            queue.add(list.get(i));
        }
        list.clear();
        while (k > 0 && !queue.isEmpty()) {
            list.add(queue.remove());
            k--;
        }
        return list;
    }
}

虽然这种方法的效率不是很高,但是能做出来也是挺好的,后期学会更简单的方法了,我会去修改的,哈哈!在这里插入图片描述


http://www.niftyadmin.cn/n/1530243.html

相关文章

排序算法原理及实现

排序算法原理及实现插入排序原理&#xff1a;实现&#xff1a;希尔排序原理&#xff1a;实现&#xff1a;选择排序原理&#xff1a;实现&#xff1a;冒泡排序原理&#xff1a;实现&#xff1a;堆排序原理&#xff1a;实现&#xff1a;快速排序归并排序排序算法的性能分析排序&a…

快速排序——一看就会,一写就废

快速排序原理&#xff1a;实现&#xff1a;partitionhoare法&#xff1a;实现&#xff1a;挖坑法&#xff1a;实现&#xff1a;前后遍历&#xff1a;实现&#xff1a;非递归实现&#xff1a;原理&#xff1a; 1、从待排序区间中选择一个数&#xff0c;作为基准值&#xff08;p…

归并排序(重要)

归并排序原理&#xff1a;分解&#xff1a;合并&#xff1a;非递归&#xff1a;原理&#xff1a; 归并排序&#xff08;mergeSort&#xff09;是建立在归并操作上的一种有效的排序算法&#xff0c;该算法采用分治法。将以有序的子序列合并&#xff0c;得到一个完全有序的序列&…

排序算法性能分析和海量数据排序问题

排序算法性能分析时间和空间复杂度快速排序的优化海量数据排序问题&#xff1a;时间和空间复杂度 整理&#xff1a; 排序稳定性时间复杂度空间度复杂度最好最坏最好/平均/最坏最好/平均/最坏冒泡排序有序逆序稳定O(n) / O(n2) / O(n2)O(1)插入排序有序逆序稳定O(n) / O(n2) /…

二叉搜索树原理及操作

二叉搜索树原理构建二叉搜索树查找插入删除原理 二叉搜索树&#xff08;Binary Search Tree BST&#xff09; 又称为二叉排序树&#xff0c;它是一颗空树或者具有以下性质&#xff1a; 它的左子树不为空&#xff0c;则左子树上所有节点的值都小于根节点的值它的右子树不为空&…

模拟实现HashMap

模拟实现HashMap模拟实现HashMap注意事项关于Set和Map区别&#xff1a;见链接&#xff1a; Set和Map 关于HashTable 见链接&#xff1a; 哈希表 模拟实现HashMap Node&#xff1a; public class Node {public String key;public Integer value;public Node next;public Nod…

SQL查询总结

查询聚合查询聚合函数GROUP BY 子句多次分组聚合HAVING联合查询内连接外连接自连接子查询[NOT] IN[NOT] EXISTSSQL基础语句查询为&#xff1a;SELECT * FROM student;聚合查询 聚合函数 常见的聚合函数有&#xff1a;MAX、MIN、AVG、COUNT、SUM 函数说明COUNT返回查询到数据…

猜数字游戏网页版

猜数字游戏网页版本猜数字游戏页面展示&#xff1a;具体实现&#xff1a;猜数字游戏 实现一个猜数字游戏。 随机产生一个数字&#xff0c;输入数字猜这个数字的大小&#xff0c;直到猜中这个数字。当你输入的这个数字小于这个随机数&#xff0c;提示猜小了&#xff0c;当你输入…