欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 教育 > 幼教 > LeetCode:1387. 将整数按权重排序(记忆化搜索 Java)

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

2025/9/25 2:03:29 来源:https://blog.csdn.net/Cosmoshhhyyy/article/details/144645631  浏览:    关键词: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来记录就行,我这里就懒得改了。

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com