zoukankan      html  css  js  c++  java
  • leetcode-每日打卡-day 3

    leetcode 每日打卡

    附上kuangbin大佬话激励自己:
    人一我百,人十我万,追逐青春的梦想,怀着自信的心,永不放弃!
    2020.2.10


    记录下来自己做题时得思路,并不一定是最优解

    #406. 根据身高重建队列

    class Solution {
    public:
        vector<vector<int>> ans;
        // 对于二维容器的排序使用lambda表达式会更快且节省内存
        static bool cmp(vector<int> a, vector<int> b)
        {
            return a[0]>b[0] || (a[0]==b[0] && a[1]<b[1]);
        }
        vector<vector<int>> reconstructQueue(vector<vector<int>>& people) {
            sort(people.begin(),people.end(),cmp);
            /* lambda表达式排序
            sort(people.begin(),people.end(),[](const auto& a,const auto& b){
                return a[0]>b[0] || (a[0]==b[0] && a[1]<b[1]);
            });
            */
            for(auto it : people)
            {
                cout << it[0] << " " << it[1] << endl;
                ans.insert(ans.begin() + it[1],it);
            }
            return ans;
        }
    };
    

    思路分析: 由于是贪心问题 ,我们可以将队列按照身高非递增排列,如果身高相同按照其前面所排人数个数降序排列
    根据leetcode官方题解的提示我们可以知道,我们先安排身高较高的人,将它放置在与 k 值相等的索引上;再安排身高比之前矮的人,同样的将它放置在与 k 值相等的索引上。

    Tips:
    
    C++ 中vector容器的insert函数可以将元素插入在该容器中
    vector.insert(插入位置,待插入元素)
    
    例如:
    ans : vector<vector<int>> 
    ans.insert(ans.begin() + it[1],it);
    
    res : vector<int>
    res.insert(5,2);
    

    #122. 买卖股票的最佳时机 II

    class Solution {
    public:
        int maxProfit(vector<int>& prices) {
            int ans = 0;
            for(int i = 1;i < prices.size();i ++)
                if(prices[i] > prices[i - 1])
                    ans += (prices[i] - prices[i-1]);
            return ans;
        }
    };
    

    #1029. 两地调度

    思路:没有用dp来做 ,自己想了个贪心策略,先按照去A市和B市差值最大的进行降序排序
    然后从头开始选择城市满足选择该城市的最优条件且人数不超过限制的时候尽可能先满足去该城市面试。

    class Solution {
    public:
        int twoCitySchedCost(vector<vector<int>>& costs) {
            sort(costs.begin(),costs.end(),[](const auto &a,const auto &b){
            return (abs(a[0] - a[1]) > abs(b[0] - b[1]));});
            int n = costs.size() / 2,A = 0, B = 0 , ans = 0;
            for(int i = 0;i < costs.size();i ++)
            {
               if((costs[i][0] >= costs[i][1] && B < n)|| (A >= n && B < n)){
                    B++;ans += costs[i][1];
                }else{
                    A++;ans += costs[i][0];
                }
            }
            return ans;
        }
    };
    
  • 相关阅读:
    树状数组BIT
    KMP算法习题(一本通)
    西大附中集训日志
    图论大杂汇
    [IOI2008/BZOJ1791 岛屿](处理基环树的小技巧&基于bfs树形DP)
    字符串知识清单
    BZOJ刷题列表【转载于hzwer】
    NOIP2018复赛游记
    求极大子矩阵的两种方法
    NOIP2002-字串变换【双向BFS】
  • 原文地址:https://www.cnblogs.com/wlw-x/p/12293428.html
Copyright © 2011-2022 走看看