首页 > 其他分享 >1387. 将整数按权重排序

1387. 将整数按权重排序

时间:2024-12-22 22:08:57浏览次数:6  
标签:排序 权重 -- lo 整数 int hi 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 位有符号整数。

@cache
def dfs(i:int) -> int:
    if i==1:
        return 0
    if i%2:
        return dfs((i*3+1)//2) + 2
    return dfs(i // 2) + 1


class Solution:
    def getKth(self, lo: int, hi: int, k: int) -> int:
        return sorted(range(lo,hi+1),key=lambda x:dfs(x))[k-1]
        

 

标签:排序,权重,--,lo,整数,int,hi,1387
From: https://www.cnblogs.com/xxlm/p/18622650

相关文章

  • 算法——排序算法(冒泡、选择、归并、堆排序)
    排序算法——冒泡排序(BubbleSort)排序算法——选择排序(SelectionSort)排序算法——插入排序(InsertionSort)排序算法——堆排序(HeapSort)排序算法——归并排序(MergeSort)......
  • 插入排序 计数排序 包括 代码 时间复杂度 空间复杂度 稳定性 是否能对代码进行提升
    插入排序代码:voidinsertsort(vector<int>&v){intn=v.size();for(inti=0;i<n;i++){intj=i-1;temp=v[i];for(;j>=0;j--){if(v[j]>temp){v[j+1]=v[j];}else{break;}}v[j+1]=......
  • 【初阶数据结构与算法】八大排序算法之交换排序(冒泡排序,快速排序---hoare、挖坑法、lo
    文章目录一、冒泡排序二、快速排序简介及其大致框架三、快排hoare版本子函数四、快排挖坑法子函数五、快排lomuto双指针子函数六、冒泡排序与快排的性能分析与比较一、冒泡排序   冒泡排序的命名是因为它的排序操作就像水平面在冒泡一样,当我们讲完冒泡排序就知道......
  • 选择排序为什么是不稳定排序
    选择排序为什么会不稳定:在选择排序中,当我们在未排序的部分中选择最小(或最大)元素并交换到已排序部分时,如果未排序部分中有两个相同的值,这种交换操作可能会导致它们的相对顺序发生改变。具体事例:假设我们有以下数组,其中有两个相同的最大值7:原始数组:[5,7,3,7,2]复制......
  • 12.22 归并排序
    includeusingnamespacestd;constintMAXN=10;intn,a[MAXN],b[MAXN];voidmergesort(int*a,intl,intr){inti,j,mid,cnt;if(l==r){return;//TODO}mid=(l+r)/2;mergesort(a,l,mid);mergesort(a;mid+1;r)i=l,j=mid+1,cnt=......
  • 希尔排序(n/3+1)
    #define_CRT_SECURE_NO_WARNINGS1#include<stdio.h>#include<stdlib.h>#include<math.h>#include<string.h>#include<ctype.h>#include<time.h>#defineMAX_LENGTH100 voidShellSort(intarr[],intn){   intgap=......
  • 本题要求编写程序,计算序列 1+2/3+3/5+4/7+5/9+6/11+... 的前N项之和。输入格式:在一行
    #include<stdio.h>intmain(){  intn;  scanf("%d",&n);  doublesum=0;  for(inti=1;i<=n;i++){    sum+=(double)i/(2*i-1);  }  printf("%.2f\n",sum);  return0;}注意sum要强制转换类型......
  • 排序链表(归并排序)
    给你链表的头结点 head ,请将其按 升序 排列并返回 排序后的链表 。 示例1:输入:head=[4,2,1,3]输出:[1,2,3,4]示例2:输入:head=[-1,5,3,4,0]输出:[-1,0,3,4,5]示例3:输入:head=[]输出:[] 方法一:归并排序/***Definitionforsingly-linkedlist.*s......
  • 各大排序总结
    因为学了冒泡后就会用sort了,完全没有学过各种排序,第一次面试因为不会手写快排GG,痛定思痛,决定认真写篇学习博客QAQ冒泡排序时间复杂度$O(n^2)$,空间复杂度$O(1)$,不断swap把大的排到后面,咕噜咕噜冒泡泡voidBubbleSort(int*a,intlen){for(inti=1;i<len;++i){......
  • 【唐叔学算法】第18天:解密选择排序的双重魅力-直接选择排序与堆排序的Java实现及性能
    引言在数据排序的世界里,选择排序是一类简单而直观的算法,它通过不断选取未排序部分中的最小(或最大)元素来逐步构建有序序列。今天,我们将深入探讨两种基于选择思想的排序方法——直接选择排序和堆排序,并提供它们的Java实现代码。此外,我们还会分析这两种排序算法的时间复杂度和......