IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 数据结构与算法 -> iOS LeetCode ? 查找和最小的K对数字 -> 正文阅读

[数据结构与算法]iOS LeetCode ? 查找和最小的K对数字

给定两个以升序排列的整数数组 nums1nums2 , 以及一个整数 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]

提示:

  • 1 <= nums1.length, nums2.length <= 104
  • -109 <= nums1[i], nums2[i] <= 109
  • nums1, nums2 均为升序排列
  • 1 <= k <= 1000

解题思路

  • 利用一个数组来保存 nums1 中每个元素对应的最小组合的 nums2 下标,这样每次只需要最多遍历 n 次就能获取剩下可用最小的组合,获取之后,对应的下标就加一,这样就可以防止重复获取。
  • 所谓双指针,指的就是 f 数组的下标对应 nums1 的下标元素,而 f 数组中的元素值对应的就是 nums2 下标元素。
  • 时间复杂度是 O(n * k) 的。

代码

	// 373. 查找和最小的K对数字
    func kSmallestPairs(_ nums1: [Int], _ nums2: [Int], _ k: Int) -> [[Int]] {
        var res = [[Int]]()
        let n = nums1.count, m = nums2.count
        guard n > 0 && m > 0 else {
            return []
        }
        // 利用一个数组来保存 nums1 中每个元素对应的最小组合的 nums2 下标,初始值为 0
        var f = [Int](repeating: 0, count: n)
        
        // 外层最多遍历 k 次,获取前 k 个最小值
        while res.count < k {
            var cur = 0
            // 遍历每个 nums1 元素对应 nums2 最小可用组合,并获取最小组合
            for i in 1..<n {
                // 当前 i 位置可用组合已经用完了
                if f[i] == m {
                    continue
                }
                // 比较获取最小的组合
                if f[cur] == m || nums1[cur] + nums2[f[cur]] > nums1[i] + nums2[f[i]] {
                    cur = i
                }
            }
            // 所有的组合都用完了,就跳出循环
            if f[cur] == m {
                break
            }
            // 答案中添加当前组合
            res.append([nums1[cur], nums2[f[cur]]])
            // 当前组合中 nums1 元素对应的 nums2 元素下标加一,这样就不会重复用到之前的组合
            f[cur] += 1
        }
        
        return res
    }
  数据结构与算法 最新文章
【力扣106】 从中序与后续遍历序列构造二叉
leetcode 322 零钱兑换
哈希的应用:海量数据处理
动态规划|最短Hamilton路径
华为机试_HJ41 称砝码【中等】【menset】【
【C与数据结构】——寒假提高每日练习Day1
基础算法——堆排序
2023王道数据结构线性表--单链表课后习题部
LeetCode 之 反转链表的一部分
【题解】lintcode必刷50题<有效的括号序列
上一篇文章      下一篇文章      查看所有文章
加:2021-11-01 11:47:26  更:2021-11-01 11:47:39 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/26 9:50:58-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码