当前位置: 首页 > article >正文

LeetCode:1387. 将整数按权重排序(记忆化搜索 Java)

目录

1387. 将整数按权重排序

题目描述:

实现代码与解析:

记忆化搜索

原理思路:


1387. 将整数按权重排序

题目描述:

        我们将整数 x 的 权重 定义为按照下述规则将 x 变成 1 所需要的步数:

  • 如果 x 是偶数,那么 x = x / 2
  • 如果 x 是奇数,那么 x = 3 * x + 1

比方说,x=3 的权重为 7 。因为 3 需要 7 步变成 1 (3 --> 10 --> 5 --> 16 --> 8 --> 4 --> 2 --> 1)。

给你三个整数 lo, hi 和 k 。你的任务是将区间 [lo, hi] 之间的整数按照它们的权重 升序排序 ,如果大于等于 2 个整数有 相同 的权重,那么按照数字自身的数值 升序排序 。

请你返回区间 [lo, hi] 之间的整数按权重排序后的第 k 个数。

注意,题目保证对于任意整数 x (lo <= x <= hi) ,它变成 1 所需要的步数是一个 32 位有符号整数。

示例 1:

输入:lo = 12, hi = 15, k = 2
输出:13
解释:12 的权重为 9(12 --> 6 --> 3 --> 10 --> 5 --> 16 --> 8 --> 4 --> 2 --> 1)
13 的权重为 9
14 的权重为 17
15 的权重为 17
区间内的数按权重排序以后的结果为 [12,13,14,15] 。对于 k = 2 ,答案是第二个整数也就是 13 。
注意,12 和 13 有相同的权重,所以我们按照它们本身升序排序。14 和 15 同理。

示例 2:

输入:lo = 7, hi = 11, k = 4
输出:7
解释:区间内整数 [7, 8, 9, 10, 11] 对应的权重为 [16, 3, 19, 6, 14] 。
按权重排序后得到的结果为 [8, 10, 11, 7, 9] 。
排序后数组中第 4 个数字为 7 。

提示:

  • 1 <= lo <= hi <= 1000
  • 1 <= k <= hi - lo + 1

实现代码与解析:

记忆化搜索

import java.util.Arrays;
import java.util.Collections;

class Solution {
    
    int[] have = new int[600010];

    public int getKth(int lo, int hi, int k) {

        Arrays.fill(have, -1);
        Integer[] res = new Integer[hi - lo + 1];

        // 初始化
        for (int i = lo, j = 0; i <= hi; i++, j++) {
            res[j] = i;
        }
        Arrays.sort(res, (a, b) -> {
            return dfs(a) - dfs(b);
        });
        for (Integer re : res) {
            System.out.println(re);
        }
        return res[k - 1];

    }

    public int dfs(Integer cur) {

        if (cur == 1) return 1;
        // 如果已经计算过了
        if (have[cur] != -1) return have[cur] + 1;

        int tmp;
        if (cur % 2 == 0) {
            tmp = dfs(cur / 2);
        } else {
            tmp = dfs(3 * cur + 1);
        }
        have[cur] = tmp;

        return tmp + 1;
    }
}

原理思路:

        直接暴力模拟其实也可以的,因为相同数字变成1的次数肯定是相同的,所以可以记忆化一下路径防止重复遍历。

        我这里直接用数组了,数比较大,所以大家正常用map来记录就行,我这里就懒得改了。


http://www.kler.cn/a/448640.html

相关文章:

  • Vue进阶之Vue RouterSSR
  • 单元测试mock框架Mockito
  • 深入理解 Linux wc 命令
  • 《LangChain大模型应用开发》书籍分享
  • 读书笔记~管理修炼-缄默效应
  • malloc 分配大堆块(128KB)的一次探索
  • 【漏洞复现】CVE-2023-29944 Expression Injection
  • React:闭包陷阱产生和解决
  • 前端面经每日一题Day18
  • 八字精批API接口PHP实现返回json数据
  • GESP CCF C++一级编程等级考试认证真题 2024年12月
  • 银行转账虚拟生成器app银行转账模拟器银行模拟器 手机银行模拟器
  • 【Redis经典面试题六】Redis的持久化机制是怎样的?
  • Anaconda使用手册
  • yolov5 yolov6 yolov7 yolov8 yolov9目标检测、目标分类 目标切割 性能对比
  • 简单介绍一下Linux的常用命令
  • 【docker】列出与特定镜像名相关的镜像
  • 【漫话机器学习系列】017.大O算法(Big-O Notation)
  • 禅说:zookeeper与聚落。
  • MySQL 基础:开启数据库之旅
  • 速通Python 第三节
  • MySQL使用LOAD DATA INFILE方式导入文本文件
  • 力扣-图论-17【算法学习day.67】
  • DCN-DCN路由器online_list.php存在任意文件读取漏洞
  • c++-----------------多态
  • 遗传算法特征筛选和GA-BP