Java C++题解 leetcode第k个数实例

 更新时间:2022年09月29日 15:19:29   作者:AnjaVon  
这篇文章主要为大家介绍了Java C++题解 leetcode第k个数实例,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪

题目要求

思路一:小根堆

  • 中文题目描述不太清晰,但其实由题目可以发现,当x满足条件时,3x、5x、7x分别也都满足条件。
  • 将满足条件的数依次放入优先队列存放用于后续计算,由于每次要取待计算队列中最小的数x,所以定义小根堆:
    • 弹出x,计算3x、5x、7x并入队;
    • 用一个哈希表记录防止重复入队。
  • 每次取数(pop)时进行计数,到第k次结束,当前队首即为答案。

Java

  • 《学到了》
    • 1L也就是long型的数字1,那么同理1f就是float型,本质上都是相等的1。
    • 还有区分Long型和long型,前者是包装类,有函数可以调用。
class Solution {
    public int getKthMagicNumber(int k) {
        int[] nums = new int[]{3, 5, 7};
        PriorityQueue<Long> que = new PriorityQueue<>();
        Set<Long> set = new HashSet<>();
        que.add(1L);
        set.add(1L);
        while (!que.isEmpty()) {
            long cur = que.poll();
            if (--k == 0)
                return (int) cur;
            for (int x : nums) { // 3、5、7依次
                if (!set.contains(x * cur)) {
                    que.add(x * cur);
                    set.add(x * cur);
                }
            }
        }
        return -1;
    }
}

C++

class Solution {
public:
    int getKthMagicNumber(int k) {
        int nums[3] = {3, 5, 7};
        priority_queue<long, vector<long>, greater<long>> que; // 小根堆
        unordered_set<long> set;
        que.push(1L);
        set.insert(1L);
        while (!que.empty()) {
            long cur = que.top();
            que.pop();
            if (--k == 0)
                return (int)cur;
            for (auto x : nums) { // 3、5、7依次
                if (!set.count(x * cur)) {
                    que.push(x * cur);
                    set.insert(x * cur);
                }
            }
        }
        return -1;
    }
};

思路二:多路归并【多指针】

Java

class Solution {
    public int getKthMagicNumber(int k) {
        int[] res = new int[k + 1];
        res[1] = 1;
        for (int i3 = 1, i5 = 1, i7 = 1, idx = 2; idx <= k; idx++) {
            int r3 = res[i3] * 3, r5 = res[i5] * 5, r7 = res[i7] * 7;
            res[idx] = Math.min(r3, Math.min(r5, r7));
            if (res[idx] == r3)
                i3++;
            if (res[idx] == r5)
                i5++;
            if (res[idx] == r7)
                i7++;
        }
        return res[k];
    }
}
  • 时间复杂度:O(k)
  • 空间复杂度:O(k)

C++

class Solution {
public:
    int getKthMagicNumber(int k) {
        int res[k + 1];
        res[1] = 1;
        for (int i3 = 1, i5 = 1, i7 = 1, idx = 2; idx <= k; idx++) {
            int r3 = res[i3] * 3, r5 = res[i5] * 5, r7 = res[i7] * 7;
            res[idx] = min(r3, min(r5, r7));
            if (res[idx] == r3)
                i3++;
            if (res[idx] == r5)
                i5++;
            if (res[idx] == r7)
                i7++;
        }
        return res[k];
    }
};
  • 时间复杂度:O(k)
  • 空间复杂度:O(k)

Rust

impl Solution {
    pub fn get_kth_magic_number(k: i32) -> i32 {
        let mut res = vec![0; (k + 1) as usize];
        res[1] = 1;
        let (mut i3, mut i5, mut i7) = (1, 1, 1);
        for idx in 2..(k + 1) as usize {
            let (r3, r5, r7) = (res[i3] * 3, res[i5] * 5, res[i7] * 7);
            res[idx] = r3.min(r5.min(r7));
            if (res[idx] == r3) {
                i3 += 1;
            }                
            if (res[idx] == r5) {
                i5 += 1;
            }                
            if (res[idx] == r7) {
                i7 += 1;
            }
        }
        res[k as usize]
    }
}
  • 时间复杂度:O(k)
  • 空间复杂度:O(k)

总结

偷懒就不写rust的优先队列了……

是“丑数”的变种题目,题目描述有点问题(力扣日常、去看原文好理解很多),做过就会技巧性并不太强的题目~

以上就是Java C++题解 leetcode第k个数实例的详细内容,更多关于Java C++题解第k个数的资料请关注脚本之家其它相关文章!

相关文章

  • C++函数参数匹配规则示例小结

    C++函数参数匹配规则示例小结

    这篇文章主要介绍了C++函数参数匹配规则,本文通过示例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2023-08-08
  • C++中unique函数的用法示例

    C++中unique函数的用法示例

    nique()是C++标准库函数里面的函数,下面这篇文章主要给大家介绍了关于C++中unique函数用法的相关资料,文中通过示例代码介绍的非常详细,需要的朋友可以参考借鉴,下面来一起看看吧
    2019-02-02
  • C++中使用cout以hex格式输出方式

    C++中使用cout以hex格式输出方式

    这篇文章主要介绍了C++中使用cout以hex格式输出方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-11-11
  • C语言中字符串处理函数sscanf的用法

    C语言中字符串处理函数sscanf的用法

    一直对于一些日期字符串中数字的提取比较头疼,现看到 sscanf 对于字符串中的内容提取较方便,本文主要介绍了C语言中字符串处理函数sscanf的用法,具有一定参考价值,感兴趣的可以了解一下
    2023-08-08
  • c语言通过栈判断括号匹配是否配对

    c语言通过栈判断括号匹配是否配对

    前面实现了栈的基本数据结构,这里来做一个联系,用栈来解决一道比较常见的算法题,就是括号配对是否满足规则,文中有相关的代码示例供大家参考,需要的朋友可以参考下
    2023-09-09
  • C语言实现刮刮乐效果是示例代码

    C语言实现刮刮乐效果是示例代码

    这篇文章主要为大家详细介绍了如何C语言模拟实现刮刮乐的效果,只要按下鼠标左键并移动就可以刮开刮卡层,感兴趣的小伙伴可以跟随小编一起学习一下
    2023-01-01
  • C++ list-map链表与映射表的简单使用

    C++ list-map链表与映射表的简单使用

    本文主要介绍了C++ list-map链表与映射表的简单使用,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-05-05
  • C语言入门篇--初识C语言及数据类型

    C语言入门篇--初识C语言及数据类型

    本篇文章是c语言基础篇,主要为大家介绍了C语言的基本类型,为大家介绍了什么是C语言,希望可以帮助大家快速入门c语言的世界,更好的理解c语言
    2021-08-08
  • C++入门基础之命名空间、输入输出和缺省参数

    C++入门基础之命名空间、输入输出和缺省参数

    C++入门基础篇的内容为C++的基本特性,只有在掌握C++的基本特性后,是进入后面类和对象学习的基础,下面这篇文章主要给大家介绍了关于C++入门基础之命名空间、输入输出和缺省参数的相关资料,需要的朋友可以参考下
    2023-01-01
  • C语言汉诺塔的简单了解

    C语言汉诺塔的简单了解

    这篇文章主要给大家介绍了关于C语言汉诺塔的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-02-02

最新评论