zoukankan      html  css  js  c++  java
  • leetcode 563

    563. Binary Tree Tilt

    Input: 
             1
           /   
          2     3
    Output: 1
    Explanation: 
    Tilt of node 2 : 0
    Tilt of node 3 : 0
    Tilt of node 1 : |2-3| = 1
    Tilt of binary tree : 0 + 0 + 1 = 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 findTilt(TreeNode* root) {
            if(root == NULL) return 0;
            
            int res = 0;
            
            postorder(root, res);
            
            return res;
        }
    private:
        int postorder(TreeNode* root, int& res){
            if(root == NULL) return 0;
            
            int leftsum= postorder(root->left,res);
            
            int rightsum = postorder(root->right,res);
            
            res += abs(leftsum - rightsum);
            
            return leftsum + rightsum + root->val;
            
        }
    };  

    566. Reshape the Matrix

    class Solution {
    public:
        vector<vector<int>> matrixReshape(vector<vector<int>>& nums, int r, int c) {
            int m = nums.size(), n = nums[0].size(), o = m * n;
            if (r * c != o) return nums;
            vector<vector<int>> res(r, vector<int>(c, 0));
            for (int i = 0; i < o; i++) res[i / c][i % c] = nums[i / n][i % n];
            return res;
        }
    };

    572. Subtree of Another Tree

    /**
     * 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 {
        vector<TreeNode*> nodes;
    
    public:
        bool isSubtree(TreeNode* s, TreeNode* t) {
            if (!s && !t) return true;
            if (!s || !t) return false;
    
            getDepth(s, getDepth(t, -1));
    
            for (TreeNode* n: nodes)
                if (identical(n, t))
                    return true;
    
            return false;
        }
    
        int getDepth(TreeNode* r, int d) {
            if (!r)
                return -1;
    
            int depth = max(getDepth(r->left, d), getDepth(r->right, d)) + 1;
    
            // Check if depth equals required value
            // Require depth is -1 for tree t (only return the depth, no push)
            if (depth == d)  //递归回去得时候,从树下开始记达到深度位d时记下
                nodes.push_back(r);
    
            return depth;
        }
    
        bool identical(TreeNode* a, TreeNode* b) {
            if (!a && !b) return true;
            if (!a || !b || a->val != b->val) return false;
    
            return identical(a->left, b->left) && identical(a->right, b->right);
        }
    };

    581. Shortest Unsorted Continuous Subarray

    Input: [2, 6, 4, 8, 10, 9, 15]
    Output: 5
    Explanation: You need to sort [6, 4, 8, 10, 9] in ascending order to make the whole array sorted in ascending order.
    class Solution {
        public int findUnsortedSubarray(int[] A) {
        int n = A.length, beg = -1, end = -2, min = A[n-1], max = A[0];
        for (int i=1;i<n;i++) {
          max = Math.max(max, A[i]);
          min = Math.min(min, A[n-1-i]);
          if (A[i] < max) end = i;
          if (A[n-1-i] > min) beg = n-1-i; 
        }
        return end - beg + 1;
    }
    }

    594. Longest Harmonious Subsequence

    Input: [1,3,2,2,5,2,3,7]
    Output: 5
    Explanation: The longest harmonious subsequence is [3,2,2,2,3].
    int findLHS(vector<int>& nums) {
            unordered_map<int,int>m;
            for(auto i: nums)
                m[i]++;
            int res = 0;
            for(auto it:m)
                if(m.count(it.first-1)>0)
                    res = max(res, it.second+m[it.first-1]);
            return res;
        }
    
    
    ///////////////////////
    int findLHS(vector<int>& nums) {
            unordered_map<int,int>m;
            int res = 0;
            for(auto i: nums){
                m[i]++;
                if(m.count(i+1))
                    res = max(res, m[i] + m[i+1]);
                if(m.count(i-1))
                    res = max(res, m[i] + m[i-1]);
            }
            return res;        
        }
    
    
    ///////////////////////////////////////
     int findLHS(vector<int>& nums) {
            sort(nums.begin(),nums.end());
            int len = 0;
            for(int i = 1, start = 0, new_start = 0; i<nums.size(); i++)
            {
    
                if (nums[i] - nums[start] > 1)    
                    start = new_start;
                if (nums[i] != nums[i-1]) 
                    new_start = i;
                if(nums[i] - nums[start] == 1)
                    len = max(len, i-start+1);
            }
            return len;

    599. Minimum Index Sum of Two Lists

    Input:
    ["Shogun", "Tapioca Express", "Burger King", "KFC"]
    ["KFC", "Shogun", "Burger King"]
    Output: ["Shogun"]
    Explanation: The restaurant they both like and have the least index sum is "Shogun" with index sum 1 (0+1).
      vector<string> findRestaurant(vector<string>& list1, vector<string>& list2) {
            vector<string>res;
            unordered_map<string,int>m;
            int min = INT_MAX;
            for(int i = 0; i < list1.size(); i++) m[list1[i]] = i;
            for(int i = 0; i < list2.size(); i++)
                if(m.count(list2[i]) != 0)
                    if(m[list2[i]] + i < min) min = m[list2[i]] + i, res.clear(), res.push_back(list2[i]);
                    else if(m[list2[i]] + i == min) res.push_back(list2[i]);
            return res;
        }

    606. Construct String from Binary Tree

    Input: Binary tree: [1,2,3,4]
           1
         /   
        2     3
       /    
      4     
    
    Output: "1(2(4))(3)"
    
    Explanation: Originallay it needs to be "1(2(4)())(3()())",
    but you need to omit all the unnecessary empty parenthesis pairs.
    And it will be "1(2(4))(3)".
    class Solution {
    public:
        string tree2str(TreeNode* t) {
            return !t ? "" : to_string(t->val) + (t->left ? "(" + tree2str(t->left) + ")" : t->right ? "()" : "")
                                               + (t->right ? "(" + tree2str(t->right) + ")" : "");
        }
    };

    617. Merge Two Binary Trees

    Input: 
    	Tree 1                     Tree 2                  
              1                         2                             
             /                        /                             
            3   2                     1   3                        
           /                                                    
          5                             4   7                  
    Output: 
    Merged tree:
    	     3
    	    / 
    	   4   5
    	  /     
    	 5   4   7
    class Solution {
    public:
        TreeNode* mergeTrees(TreeNode* t1, TreeNode* t2) {
            if (!t1 || !t2) return t1 ? t1 : t2;
    
            TreeNode* node = new TreeNode(t1->val + t2->val);
            node->left = mergeTrees(t1->left, t2->left);
            node->right = mergeTrees(t1->right, t2->right);
            return node;
        }
    };

    633. Sum of Square Numbers

    Input: 5
    Output: True
    Explanation: 1 * 1 + 2 * 2 = 5
    bool judgeSquareSum(int c) {
            for(int i=0;i<=sqrt(c);i++) {
                int t=sqrt(c-i*i);
                if(t*t==c-i*i) return true;
            }
            return false;
        }

    637. Average of Levels in Binary Tree

    /**
     * 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:
           vector<double> averageOfLevels(TreeNode* root) {
            vector<double> res;
            queue<TreeNode*> q;
            q.push(root);
            while(!q.empty()) {
                long temp=0;
                int s=q.size();
                for(int i=0;i<s;i++) {
                    TreeNode* t=q.front();
                    q.pop();
                    if(t->left) q.push(t->left);
                    if(t->right) q.push(t->right);
                    temp+=t->val;
                }
                res.push_back((double)temp/s);
            }
            return res;
        }
    };

    645. Set Mismatch

    Input: nums = [1,2,2,4]
    Output: [2,3]
    

    思路:使数组按123。。。n来排序,如果当前的内容和index不匹配,则交换

    vector<int> findErrorNums(vector<int>& nums) {
            for(int i = 0; i<nums.size(); i++){
                while(nums[i] != nums[nums[i] - 1])swap(nums[i], nums[nums[i] - 1]);
            }
            for(int i = 0; i<nums.size() ; i++){
                if(nums[i] != i + 1)return {nums[i], i + 1};
            }
        }

    653. Two Sum IV - Input is a BST

    Input: 
        5
       / 
      3   6
     /    
    2   4   7
    
    Target = 9
    
    Output: True
    //方法一:使用map来进行一次遍历
    bool
    findTarget(TreeNode* root, int k) { unordered_set<int> set; return dfs(root, set, k); } bool dfs(TreeNode* root, unordered_set<int>& set, int k){ if(root == NULL)return false; if(set.count(k - root->val))return true; set.insert(root->val); return dfs(root->left, set, k) || dfs(root->right, set, k); } ///////////////////////////////////////////////////// //方法二:先使用中序遍历使其按小到大来排序,然后对排序后的数组进行首尾相加 bool findTarget(TreeNode* root, int k) { vector<int> nums; inorder(root, nums); for(int i = 0, j = nums.size()-1; i<j;){ if(nums[i] + nums[j] == k)return true; (nums[i] + nums[j] < k)? i++ : j--; } return false; } void inorder(TreeNode* root, vector<int>& nums){ if(root == NULL)return; inorder(root->left, nums); nums.push_back(root->val); inorder(root->right, nums); } /////////////////////////////////////////////////////// bool findTarget(TreeNode* root, int k) { return dfs(root, root, k); } bool dfs(TreeNode* root, TreeNode* cur, int k){ if(cur == NULL)return false; return search(root, cur, k - cur->val) || dfs(root, cur->left, k) || dfs(root, cur->right, k); } bool search(TreeNode* root, TreeNode *cur, int value){ if(root == NULL)return false; return (root->val == value) && (root != cur) || (root->val < value) && search(root->right, cur, value) || (root->val > value) && search(root->left, cur, value); }
  • 相关阅读:
    微信门户开发框架-使用指导说明书
    在Winform界面使用自定义用户控件及TabelPanel和StackPanel布局控件
    C++迟后联编和虚函数表
    PaX介绍——针对linux kernel的一个加固版本的补丁,是这个星球上有史以来最极端和最优秀的防御系统级别0day的方案
    侧信道攻击——基于从密码系统的物理实现中获取的信息而非暴力破解法或是算法中的理论性弱点(较之密码分析)。例如:时间信息、功率消耗、电磁泄露或甚是声音可以提供额外的信息来源作为破解输入
    默克尔树(merkle tree)——就是hash树,比特币区块链里用于校验完整性的
    spark RDD pipe 调用外部脚本
    AIDE(高级入侵检测环境)——就是讲文件的hash值存到db中,然后比较是否被篡改过
    完整性度量架构(IMA)介绍与分析——当应用程序运行、动态链接库加载、内核模块加载时,将用到的代码和关键数据(如配置文件和结构化数据)做一次hash比较的感觉
    AES中的ECB、CTR、MAC、GMAC、GCM
  • 原文地址:https://www.cnblogs.com/hotsnow/p/10062281.html
Copyright © 2011-2022 走看看