zoukankan      html  css  js  c++  java
  • 由leetcode俄罗斯套娃信封问题到C++的sort()函数学习

    时隔很久的重新刷题,然后第一道就是一道hard,本着不服输的原则,我立马去看了,然后迅速打开了讲解,然后恍然大悟,立马开始敲代码,10分钟后,画面依然定格在它原来的样子。我用c++写的,但是对于c++的函数我其实并不知道什么。这道题的思路是先进行排序,然后转变成求最长上升子序列的问题。信封的嵌套规则是:if w1<w2&&h1<h2则信封1可以放进信封2。要求的是一个最大的嵌套数。

    1.根据w进行一个降序排序,如果w相同则对h进行一个升序排序。n1[w1,h1],n2[w2,h2]

    2.得到排序结束之后的一个二维数组,然后对h进行一个最长子序列的求解,得到的就是我们要的结果。

    想法很美好,但是,这个排序怎么搞?我一开始居然打算手写排序,用快排,但是我觉得应该不至于,java都有自己的排序函数,c++怎么会没有呢?果然,只是我知识浅薄,然后就学习了一波c++的sort函数。

    需要包含头文件:#include <algorithm>

    在这里我主要使用sort函数来对w进行升序排序,然后在w相同时对h进行降序排序,即对二维数组的一个二级排序。

    sort(buffer,buffer+n,cmp)

    其中

    buffer:待排序数组起始地址

    buffer+n: n就是待排序的元素数量,buffer+n就是待排序数组尾地址

    cmp:指定排序的方式,取值为1/true:升序   0/false:降序,缺省表示升序。

    用来处理我们的第一问:

    1 bool cmp(vector<int>&v1,vector<int>&v2){
    2     if(v1[0]==v2[0]){//w相等
    3         return v1[1]>v2[1];
    4     }else{//w不相等
    5         return v[0]<v2[0];
    6     }
    7 }

    这个问题的整体代码:(代码是搬运了大佬的回答,感觉比较清晰,在leetcode的答题中复制的,所以不知道谁写的)

    1 int maxEnvelopes(vector<vector<int>>& envelopes) {
    2     sort(envelopes.begin(), envelopes.end(),cmp);
    3     //利用LIS算法求出h的最长递增子序列
    4     return lengthOfLIS(envelopes);
    5 }
     1 int lengthOfLIS(vector<vector<int>>& nums) {
     2         int n = nums.size();
     3         if(n == 0)
     4             return 0;
     5         vector<int> dp(n + 1, 0);//dp[i]表示长度为i的上升序列的最小末尾元素
     6         //末尾元素越小,那么它的后续发展潜力更大
     7         //即在后面追加更大元素以形成更长上升序列的几率更大
     8         int len = 1;
     9         dp[len] = nums[0][1];
    10         for(int i = 1; i < n; i++){
    11             if(nums[i][1] > dp[len]){//大于末尾最小数字 加入即可
    12                 dp[++len] = nums[i][1];
    13             }
    14             else{//nums[i] <= nums[i - 1]
    15                 int l = 1;
    16                 int r = len;
    17                 int pos = 0;//要是没有找到比它小的 说明都大于它 因此直接替换0 + 1处即可
    18                 //二分法在dp中找到比nums[i]小的第一个元素
    19                 while(l <= r){//细节  必须等于
    20                     int mid = (l + r) / 2;// /2
    21                     if(nums[i][1] > dp[mid]){
    22                         pos = mid;
    23                         l = mid + 1;
    24                     }
    25                     else{
    26                         r = mid - 1;
    27                     }
    28                 }
    29                 dp[pos + 1] = nums[i][1];//并将其替换
    30             }
    31         }
    32         return  len;
    33     }
  • 相关阅读:
    element-ui el-tree竖向滚动条和横向滚动条问题
    菜单加滚动条相关样式
    echarts tree 树图总结,点击父节点动态生成子节点,树图数据过多高度自适应,点击子节点跳转页面。
    基于Mininet测量路径的损耗率
    RyuBook1.0案例一:Switching Hub项目源码分析
    深度学习之稠密连接⽹络(DENSENET)
    图形学之图像信号处理
    图形学之卷积滤波器
    图形学之信号处理
    Lecture13_光线追踪1(Whitted-Style Ray Tracing)_GAMES101 课堂笔记
  • 原文地址:https://www.cnblogs.com/doris233/p/13941491.html
Copyright © 2011-2022 走看看