首页 > 其他分享 >1387. 将整数按权重排序(递归 +记忆化+排序)

1387. 将整数按权重排序(递归 +记忆化+排序)

时间:2023-12-14 11:05:29浏览次数:31  
标签:排序 权重 weight -- 整数 递归 int 1387


Problem: 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 个数。


文章目录

  • 思路
  • 解题方法
  • Code


思路

计算每个数的权重,递归记忆化,然后按照权重排序,相同时按照数本身排.

解题方法

数据范围不大,递归+记忆化就可以

Code

class Solution {
private : 
struct node {
    int x ; 
    int weight;
} ; 
public:

    unordered_map<int,int> memo ; 
    static bool cmp(const node &x , const  node &y){
        if(x.weight != y.weight) {
            return x.weight < y.weight ; 
        }else{
            return x.x < y.x ; 
        }
    }
    int dfs(int x ) {
        if(x <=1 ) return 0 ; 
        if(x ==2 ) return 1 ; 
        if(memo.count(x)) {
            return memo[x] ; 
        }
        // 偶数
        if( x%2 == 0) {
            return memo[x] = dfs(x/2) +1  ;
        }else{
            return memo[x] = dfs(3*x+1) +1 ; 
        }
    }
    int getKth(int lo, int hi, int k) {
        vector<node> r ; 
        for(int i = lo ; i<=hi ; i++) {
            int w = dfs(i) ; 
            r.push_back( {i,w}) ; 
        }  
        sort(r.begin() ,r.end(),cmp) ; 


        return r[k-1].x  ;   

    }
};


标签:排序,权重,weight,--,整数,递归,int,1387
From: https://blog.51cto.com/u_15970235/8815666

相关文章

  • Python算法——计数排序
    计数排序(CountingSort)是一种非比较性排序算法,适用于对一定范围内的整数进行排序。它通过统计每个元素出现的次数,然后根据统计信息重新构建有序数组。计数排序是一种线性时间复杂度的排序算法,具有稳定性和适用性广泛的特点。本文将详细介绍计数排序的工作原理和Python实现。计数排......
  • SQL中的排序中的排序
    SQL中的排序中的排序任务表,有个需求,排序按照重要程序排序,在重要的任务里按照更新时间来排序,然后在不重要的任务里按照ID来排序,解决如下: selecta.id,a.title,a.isimport,a.updatetimefrom(select*frommubiaoswhereisimport=1unionselect*frommubia......
  • 子类父类有相同的方法优先调用子类-重写-递归
    子类和父类有相同的方法,优先调用子类。如果子类没有,父类。packagestudyDemo9yue;publicclassstudy01{ publicstaticvoidmain(String[]args){ Sons1=newSon(); s1.test(); }}classFather{ voidtest(){ System.out.println("我是父类的test"); }}c......
  • 递归和master公式
    递归的本质是系统帮我们进行了压栈,栈的名字叫做系统栈。但系统栈的空间十分有限,因此在工程上我们需要把递归改写成用内存中的栈来模拟系统压栈,以此来实现非递归。master公式又叫主定理,是一种估算递归时间复杂度的公式。但有个前提条件:只有是子问题规模相同的递归才能使用。T(N)......
  • 【反转链表】while循环/递归
    leetcode206.反转链表题意:给定链表表头,反转链表,返回反转链表的表头【循环】题解:head维护原链表当前节点,nHead维护反转链表的头节点,nHead置于head前一位,依次后移,直至head到链表尾结束。双指针循环版本/***Definitionforsingly-linkedlist.*publicclassListNode......
  • 冒泡排序详解
    算法思想1、两两相邻的元素进行比较,如果前面元素大于后面元素就交换两个元素的位置,最终的结果是最大的一个元素移动到了最后的位置。 我们暂称这个过程为冒泡。2、如果有n个元素那么【冒泡操作】重复n-1次即可排序完成。    学习过程思想1.一共两层for循环2.第一个fo......
  • Python:递归函数
    一、函数的递归什么是函数的递归:函数的递归就是函数的递归调用:是函数嵌套调用的一种形式。具体是指:在调用一个函数的过程中又直接或者间接的调用到本身。#1、直接调用本身(简单理解为死循环)deff1():print('直接调用本身实例:')f1()#调用f1()#由于没有......
  • 学C笔记归纳 第十三篇——函数3 递归(重点)
    1.什么叫递归?    递归是一种编程技巧,程序调用自身的编程技巧称为“递归”,应用广泛。2.描述递归    递归把一个大型复杂问题层层转化为一个与原问题相似的规模较小的问题来求解,    只需要少量的程序就可以描述出解题过程所需要的多次重复计算,大大减少......
  • sort 排序命令
    目录基本语法选项举个......
  • 【洛谷 P1271】【深基9.例1】选举学生会 题解(计数排序)
    【深基9.例1】选举学生会题目描述学校正在选举学生会成员,有名候选人,每名候选人编号分别从1到,现在收集到了张选票,每张选票都写了一个候选人编号。现在想把这些堆积如山的选票按照投票数字从小到大排序。输入格式输入和以及个选票上的数字。输出格式求出排序后的选票编......