zoukankan      html  css  js  c++  java
  • LeetCode 要记得一些小trick

      最近搞了几场编程比赛,面试题或者是LeetCode周赛。每次都不能做完,发现时间不够用。

      看了别人的代码才知道,同样实现相同的功能,可能别人只需要用一个恰当的函数,就会比自己少些不少代码,争得了时间。所以这些小技巧对于提升名次来说,十分重要。以后需要

    更加重视才行。

      拿LeetCode Weekly Contest 27 来举个例子:

      第二题:

    556. Next Greater Element III

    Given a positive 32-bit integer n, you need to find the smallest 32-bit integer which has exactly the same digits existing in the integer n and is greater in value than n. If no such positive 32-bit integer exists, you need to return -1.

    Example 1:

    Input: 12
    Output: 21
    

    Example 2:

    Input: 21
    Output: -1
    class Solution {
    public:
        int nextGreaterElement(int n) {
            char s[32];
            sprintf(s, "%d", n);
            int len = strlen(s);
            sort(s, s + len);
            do{
                if(atoll(s) > n && atoll(s) < INT_MAX)
                    return  atoll(s);
            }while(next_permutation(s, s + len));
            return -1;
        }
    };

    1. 使用 next_permutation

    2. atoll ~ atoi

    3. to_string()          int->string

    sprintf(s, "%d", n);     int->char{]

    4.32bit int 最大值 INT_MAX 定义在头文件<limits.h>中。

    
    

      第三题:

    549. Binary Tree Longest Consecutive Sequence II

    Given a binary tree, you need to find the length of Longest Consecutive Path in Binary Tree.

    Especially, this path can be either increasing or decreasing. For example, [1,2,3,4] and [4,3,2,1] are both considered valid, but the path [1,2,4,3] is not valid. On the other hand, the path can be in the child-Parent-child order, where not necessarily be parent-child order.

    Example 1:

    Input:
            1
           / 
          2   3
    Output: 2
    Explanation: The longest consecutive path is [1, 2] or [2, 1].
    

    Example 2:

    Input:
            2
           / 
          1   3
    Output: 3
    Explanation: The longest consecutive path is [1, 2, 3] or [3, 2, 1].
    /**
     * Definition for a binary tree node.
     * struct TreeNode {
     *     int val;
     *     TreeNode *left;
     *     TreeNode *right;
     *     TreeNode(int x) : val(x), left(NULL), right(NULL) {}
     * };
     */
    
    class Solution {
    public:
        int longestConsecutive(TreeNode* root) {
            if(!root) return 0;
            unordered_map<TreeNode*, vector<TreeNode*>>g;
            queue<TreeNode*> que;
            que.push(root);
            while(!que.empty()){
                TreeNode *u = que.front();
                que.pop();
                if(u -> left){
                    g[u].push_back(u -> left);
                    g[u -> left].push_back(u);
                    que.push(u -> left);
                }if(u -> right){
                    g[u].push_back(u -> right);
                    g[u -> right].push_back(u);
                    que.push(u -> right);
                }
            }
            int ret = 0;
            for(auto &it: g){
                ret = max(ret, helper(it.first, g));
            }
            return ret + 1;
        }
        
        int helper(TreeNode* u, unordered_map<TreeNode*, vector<TreeNode*>>&g){
            if(u == NULL) return 0;
            int level = 0;
            for(int i = 0; i < g[u].size(); i ++){
                if(g[u][i] -> val == u -> val + 1){
                    level = max(level, helper(g[u][i], g) + 1);    
                }
            }
            return level;
        }
    };
    
    
    /*
    class Solution {
    public:
        int longestConsecutive(TreeNode* root) {
            if (!root) return 0;
            unordered_map<TreeNode*, vector<TreeNode*>> g;
            queue<TreeNode*> q;
            q.push(root);
            while (!q.empty()) {
                TreeNode* t = q.front();
                q.pop();
                if (t->left) { g[t].push_back(t->left); g[t->left].push_back(t); q.push(t->left); }
                if (t->right) { g[t].push_back(t->right); g[t->right].push_back(t); q.push(t->right); }
            }
            int result = 0;
            for (auto& p : g) {
                result = max(result, helper(p.first, g));
            }
            return result + 1;
    
        }
        int helper(TreeNode* s, unordered_map<TreeNode*, vector<TreeNode*>>& g) {
            int level = 0;
            for (TreeNode* n : g[s]) {
                if (n->val == s->val + 1) level = max(level, 1 + helper(n, g));
            }
            return level;
        }
    };
    */

    我的代码一开始传递参数的时候,没传引用,就TLE了。

    传递引用虽然不安全,但是要比cp一个新的数据结构要快太多了。

  • 相关阅读:
    flash
    应用缓存
    音频和视频
    拖拽借口
    地理定位接口
    表单元素
    jquery常见用法
    jquery ajax 模板
    Ubuntu下Lucene环境搭配
    小絮叨
  • 原文地址:https://www.cnblogs.com/luntai/p/6684687.html
Copyright © 2011-2022 走看看