zoukankan      html  css  js  c++  java
  • leet code 1387. 将整数按权重排序

    自以为想到了一个简单方法,代码如下:

    class Solution {
    public:
        int getKth(int lo, int hi, int k) {
            unordered_map<int, int> step_map;
            vector<pair<int, int>> weights;
            for (int i=lo; i<=hi; i++) {
                weights.emplace_back(pair<int,int>{i,calcuStep(step_map,i)});
            }
    
            sort(weights.begin(), weights.end(), 
                    [=](pair<int, int> a, pair<int, int> b){
                        if (a.second!=b.second){
                            return a.second<b.second;
                        }
                        else {
                            return a.first<b.first;
                        }  
                    });
            
            return weights[k-1].first;
    
        }
    
        int calcuStep(unordered_map<int, int>& step_map, int val) {
            vector<int> num_in_process;
            auto itr = step_map.find(val);
            if (itr!=step_map.end()) {
                return itr->second;
            }
            int step_num = 0;
            
            while(val != 1) {
                num_in_process.emplace_back(val);
                if (val%2 == 0) {
                    val = val/2;
                }
                else {
                    val = val*3 +1;
                }
                 step_num++;
                 itr = step_map.find(val);
                 if (itr!=step_map.end()) {
                     step_num += itr->second;
                     for (int i=0; i< num_in_process.size(); i++) {
                         step_map[num_in_process[i]] = step_num-i;
                     }
                     return step_num;
                 }
            }
    
            return step_num;
        }
    };

    思想就是使用记忆,代码编写和调试耗时一小时多,但看了答案后发现写的好low,答案是用递归写的,看着就漂亮
    class Solution {
    public:
        int getKth(int lo, int hi, int k) {
            unordered_map<int, int> weights_map;
            vector<pair<int,int>> weights;
            for (int i=lo; i<=hi; i++) {
                weights.emplace_back(pair<int,int>{i,F(weights_map,i)});
            }
            sort(weights.begin(), weights.end(),
                [=](pair<int, int> a, pair<int, int> b) {
                    if (a.second == b.second) {
                        return a.first<b.first;
                    }
                    else {
                        return a.second<b.second;
                    }
                });
            return weights[k-1].first;
        }
    
        int F(unordered_map<int, int>& weights_map, int num) {
            if (num==2) {
                return 1;
            }
            if (weights_map.find(num)!=weights_map.end()) {
                return weights_map[num];
            }
            if (num & 1) {
                 return weights_map[num] =  1+ F(weights_map,3*num+1);
            }
            else {
                return weights_map[num] = 1+F(weights_map,num/2);
            }
            
        }
    };
    
    
    

      

     
  • 相关阅读:
    django DEBUG=False
    Lftp 简单使用步骤
    django admin管理后台中文添加问题
    Rsync同步设置的一例
    在nginx中,禁止IP访问.只可以使用域名访问.
    python imaplib无痕取信的主要
    Centos安装配置Postfix邮件服务器--网址
    还没有写完准备弡上cpickle 还有字典
    python 截取某一天的日志,简单操作
    abp 关闭审计日志
  • 原文地址:https://www.cnblogs.com/rulin/p/13028880.html
Copyright © 2011-2022 走看看