leetcode补全计划-20180830

  1. 312 Burst Balloons
    输入:int数组
    输出:int
    题意:扎气球,最终得到的分数最大,每扎一个气球,得到的分数时该气球和旁边两个气球三个数字的乘积。
    思路:分治法来进行动态规划。值得注意的是,动态规划中经常用到的从反方向来思考问题在这儿用到了。分治策略:因为最终得到的分数不受已经爆掉的气球的影响,因此我们按照最后爆掉的气球来进行情况划分。
class Solution {
public:
    int maxCoins(vector<int>& nums) {
        vector<int> ns;
        ns.push_back(1);
        for(auto a : nums) if(a > 0) ns.push_back(a);
        ns.push_back(1);
        int size = ns.size();
        
        vector<vector<int>> dp(size + 1, vector<int>(size + 1, 0));
        for(int k = 2;k < size;++ k){
            for(int left = 0;left < size - k;++ left){
                int right = left + k;
                for(int i = left + 1;i < right;++ i){
                    int tmp = ns[left] * ns[i] * ns[right] + dp[left][i] + dp[i][right];
                    // cout<<tmp<<endl;
                    dp[left][right] = max(dp[left][right], tmp);
                }
            }
        }
        return dp[0][size - 1];
    }
};
  1. 324 Wiggle Sort II
    输入:int数组
    输出:void
    要求:摇摆排序,时间复杂度O(n),空间复杂度O(1)。
    思路:先求出中位数,然后将小于中位数的放在奇数位置,大于中位数的放在偶数位置。
    值得注意的几个地方:
  • nth_element()函数的使用。
  • #define A(i) nums[(1 + 2 * (i)) % (size | 1)]可以用来更改索引顺序。
class Solution {
public:
    void wiggleSort(vector<int>& nums) {
        int size = nums.size();
        auto midptr = nums.begin() + size / 2;
        nth_element(nums.begin(), midptr, nums.end());
        int mid = *midptr;
        // cout<<mid<<endl;
        
        #define A(i) nums[(1 + 2 * (i)) % (size | 1)]
        int index_odd = 0;
        int index_even = size - 1;
        int index = 0;
        while(index <= index_even){
            if(A(index) > mid){
                swap(A(index_odd ++), A(index ++));
            }else if(A(index) < mid){
                swap(A(index), A(index_even --));
            }else{
                index ++;
            }
        }
    }
};
  1. 335 Self Crossing
    输入:int数组
    输出:是否有自环
    要求:从原点开始,逆时针走,按照北西南东的顺序。
    思路:


    情况分类图
class Solution {
public:
    bool isSelfCrossing(vector<int>& x) {
        int size = x.size();
        if(size <= 3) return false;
        for(int i = 3;i < size;++ i){
            if(x[i] >= x[i - 2] && x[i - 1] <= x[i - 3]) return true;
            if(i >= 4) if(x[i - 1] == x[i - 3] && (x[i] + x[i - 4]) >= x[i - 2]) return true;
            if(i >= 5) if(x[i - 5] + x[i - 1] >= x[i - 3] && x[i] + x[i - 4] >= x[i - 2] && \
                          x[i - 2] >= x[i - 4] && x[i - 1] <= x[i - 3]) return true;
        }
        return false;
    }
};
  1. 336 Palindrome Pairs
    输入:字符串数组
    输出:vector<vector<int>>
    要求:返回能够构成回文串的各个字符串组
    举例:
Input: ["abcd","dcba","lls","s","sssll"]
Output: [[0,1],[1,0],[3,2],[2,4]] 

思路:Hash Table
值得注意的地方:

  • is_palindrome++--的位置问题
  • 对空串的处理:每次处理都会判断该word是不是整个字符串构成一个回文串,如果是的话,那就找一下有没有空串在map里边。
class Solution {
public:
    vector<vector<int>> palindromePairs(vector<string>& words) {
        vector<vector<int>> ret;
        map<string, int> tool;
        for(int i = 0;i < words.size();++ i) tool[words[i]] = i;
        
        for(int index = 0;index < words.size();++ index){
            string word = words[index];
            int size = word.size();
            for(int i = 0;i <= size;++ i){
                if(i > 0 && is_palindrome(word, 0, i - 1)){
                    string tmp = word.substr(i);
                    reverse(tmp.begin(), tmp.end());
                    if(tool.find(tmp) != tool.end() && tool[tmp] != index){
                        ret.push_back({tool[tmp], index});
                    }
                }
                if(is_palindrome(word, i,size - 1)){
                    string tmp = word.substr(0, i);
                    reverse(tmp.begin(), tmp.end());
                    if(tool.find(tmp) != tool.end() && tool[tmp] != index){
                        ret.push_back({index, tool[tmp]});
                    }
                }
            }
        }
        
        return ret;
    }
    bool is_palindrome(string& word, int begin, int end){
        while(begin < end){
            if(word[begin++] != word[end--]) return false;
        }
        return true;
    }
};
  1. 365 Water and Jug Problem
    输入:x和y是水壶的容量,z是要称量的水量
    输出:bool(是否能称量出来)
    思路:求取x和y的最大公约数,然后看z能不能整除该数字。
class Solution {
public:
    bool canMeasureWater(int x, int y, int z) {
        return z == 0 || (z <= x + y && z % gcd(x, y) == 0);
    }
    int gcd(int x, int y){
        return y == 0 ? x : gcd(y, x % y);
    }
};
  1. 381 Insert Delete GetRandom O(1) - Duplicates allowed
    题意:构造题,以O(1)的时间复杂度来进行元素的增删和返回任意值
    思路:因为允许重复元素的存在,因此我们需要将所有的重复元素出现的位置保存下来以供调用。因此需要两个数据结构。一个数组来存储数字,一个map来映射元素值和其位置。数组中存储的是pair,因为remove的过程中要修改相应位置上的值,我们需要知道需要修改的值对应的是m[val]中的第几个。
class RandomizedCollection {
public:
    /** Initialize your data structure here. */
    RandomizedCollection() {
    }
    
    /** Inserts a value to the collection. Returns true if the collection did not already contain the specified element. */
    bool insert(int val) {
        auto ret = m.find(val) == m.end();
        
        m[val].push_back(nums.size());
        nums.push_back({val, m[val].size() - 1});
        
        return ret;
    }
    
    /** Removes a value from the collection. Returns true if the collection contained the specified element. */
    bool remove(int val) {
        auto ret = m.find(val) != m.end();
        if(ret){
            auto last = nums.back();
            m[last.first][last.second] = m[val].back();
            nums[m[val].back()] = last;
            m[val].pop_back();
            nums.pop_back();
            if(m[val].empty()) m.erase(val);
        }
        return ret;
    }
    
    /** Get a random element from the collection. */
    int getRandom() {
        return nums[rand() % nums.size()].first;
    }
private:
    vector<pair<int, int>> nums;//{val, index of val into m[val]}
    unordered_map<int, vector<int>> m;//m[nums[i].first][nums[i].second] == i
};

/**
 * Your RandomizedCollection object will be instantiated and called as such:
 * RandomizedCollection obj = new RandomizedCollection();
 * bool param_1 = obj.insert(val);
 * bool param_2 = obj.remove(val);
 * int param_3 = obj.getRandom();
 */
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 【题目描述】 Given n balloons, indexed from 0 ton-1. Each ballo...
    程风破浪会有时阅读 3,017评论 0 0
  • 背景 一年多以前我在知乎上答了有关LeetCode的问题, 分享了一些自己做题目的经验。 张土汪:刷leetcod...
    土汪阅读 14,354评论 0 33
  • LeetCode 刷题随手记 - 第一部分 前 256 题(非会员),仅算法题,的吐槽 https://leetc...
    蕾娜漢默阅读 18,179评论 2 36
  • 感赏老公辛苦工作 感赏女儿今天早点睡了 感赏包老师的分享 感赏自己做的晚饭 感赏今天有人咨询能量名 感赏今天一到站...
    艳荣宝宝阅读 1,072评论 0 0
  • 今天五月初十,是彭宝宝农历满一岁的生日,我们一直在家商量,怎么给他过一个有意义的生日呢,最后的结果是:他吃西瓜皮儿...
    多则惑少则得阅读 3,150评论 0 0

友情链接更多精彩内容