ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

leetcode 经典题

2022-07-14 15:03:10  阅读:142  来源: 互联网

标签:return nums int res next 经典 leetcode left


#include <iostream>
#include <vector>
#include <stack>
#include <string>
#include <algorithm>
#include <climits> 
#include <unordered_map>
#include <unordered_set>
#include <queue>
using namespace std;

template<typename T>
void print(const vector<T>& nums)
{
    for(auto & num : nums)
    {
        cout << num << " ";
    }
    cout << endl;

}

struct TreeNode
{
    int val = 0;
    TreeNode* left = nullptr;
    TreeNode* right = nullptr;
    TreeNode* next = nullptr;
    TreeNode(int val_):val(val_),left(nullptr),right(nullptr),next(nullptr) 
    {
        ;
    }
};


struct LinkNode
{
    int val = 0;
    LinkNode* next = nullptr; 
    LinkNode* random = nullptr;
    LinkNode(int val_)
    {
        val = val_;
    }
};

void merge(vector<int>& nums1, int m, vector<int>& nums2, int n) {
    int i = m - 1;
    int j = n - 1;
    int k = m + n - 1;
    while(i >= 0 && j >= 0)
    {
        if(nums1[i] > nums2[j])
        {
            nums1[k--] = nums1[i--];
        }
        else
        {
            nums1[k--] = nums2[j--];
        }

    }
    while(i >= 0)
    {
        nums1[k--] = nums1[i--];
    }
    while(j >= 0)
    {
        nums1[k--] = nums2[j--];
    } 
}

bool isValidBST(TreeNode* root)
{
      //递归
//      if(root == nullptr)return true;
//      bool left = isValidBST(root->left);
//      bool right = isValidBST(root->right);
//      if(!left)return false;
//      if(root->val_ <= preV)return false;
//      return isValidBST(root->right);
      //递归

      //非递归
      TreeNode* pre = nullptr;
      stack<TreeNode*>st;
      while(root!= nullptr||!st.empty())
      {
          while(root != nullptr)
          {
              st.push(root);
              root = root->left;
          }
          root = st.top();
          st.pop();
          if(pre!= nullptr && root->val <=pre->val)return false;
          pre = root;
          root=root->right;
      }
      return true;

//    return isValidBST(root, -1, -1);
}


LinkNode* generateLinkNode(vector<int>& nums)
{
    int n = nums.size(); 
    LinkNode dummy(0);
    LinkNode* head = &dummy;
    for(int i = 0; i < n; ++i)
    {
       
       LinkNode* cur = new LinkNode(nums[i]);
       head->next = cur;    
       head = head->next;
    }
    return dummy.next;
}

int partition(vector<int>& nums,int left,int right)
{
    int piv = nums[right];
    int start = left,end = right -1;
    while(start <= end)
    {
        if(nums[start] < piv)++start;
        else if(nums[end]>piv)--end;
        else
        {
            swap(nums[start++],nums[end--]);
        }    
    }
    swap(nums[start],nums[right]);
    return start;
}

void helper(vector<int>& nums,int left,int right)
{
    if(left > right)return;
    int pi = partition(nums,left,right);
    helper(nums,left,pi-1);
    helper(nums,pi+1,right);
    return;
}

vector<pair<int,int>>dirs{{0,-1},{0,1},{1,0},{-1,0}};

class DSU{
    vector<int>parent_;
    public:
    DSU(int N)
    {
        parent_.resize(N);
        for(int i = 0; i < N; ++i)
        {
            parent_[i] = i;
        }
    }
    int find(int x)
    {
        if(parent_[x] != x)parent_[x] = find(parent_[x]);
        return parent_[x];
    }
    void Union(int x, int y)
    {
        parent_[find(x)] = find(y);
    }
};

void bfs(vector<vector<string>>& grid, int i ,int j)
{
    queue<pair<int,int>>q;
    q.push({i,j});
    while(!q.empty())
    {
        auto cur = q.front();
        q.pop();
        int x = cur.first,y = cur.second;
        if(x < 0 || x >= grid.size() || y < 0 || y >= grid[0].size() || grid[x][y] == "0")continue;
        grid[x][y] = "0";
        for(auto dir:dirs)
        {
            q.push({x+dir.first,y+dir.second});
        }
    }
}

void dfs_stack(vector<vector<string>>&grid,int i,int j)
{
    stack<pair<int,int>>st;
    st.push({i,j});
    while(!st.empty())
    {
        auto cur = st.top();
        st.pop();
        int x = cur.first, y = cur.second;
        if(x < 0 || x >= grid.size() || y < 0 || y >= grid[0].size() || grid[x][y] == "0")continue;
        grid[x][y] = "0";
        for(auto p:dirs)
        {
            st.push({x + p.first,y+p.second});
        }
    }
}
void dfs(vector<vector<string>>&grid,int i, int j)
{
    if(i < 0 || i >= grid.size() || j < 0 || j >= grid[0].size() || grid[i][j] == "0")
        return ;
    grid[i][j] = "0";
    dfs(grid,i-1,j);
    dfs(grid,i+1,j);
    dfs(grid,i,j-1);
    dfs(grid,i,j+1);
    return;
}
int numIslands(vector<vector<string>>&grid)
{
    int m = grid.size(), n = grid[0].size(),res = 0;
    // DSU dsu(m*n);

    for(int i = 0; i < m ;++i)
    {
        for(int j = 0; j < n; ++j)
        {
            if(grid[i][j] == "1")
            {
                ++res;
                // dfs_stack(grid,i,j);
//                bfs(grid,i,j);
               dfs(grid,i,j);
//                DSU
//                for(const pair<int,int>p:dirs)
//                {
//                    int x = i + p.first, y = j + p.second;
//                    if(x >= 0 && y >= 0 && x < m && y < n && grid[x][y] == "1")
//                    {
//                        if(dsu.find(x*n+y)!=dsu.find(i*n+j)) --res;
//                        dsu.Union(x*n+y,i*n+j);
//                    }
//                }
            }
        }
    }
    return res;
}


vector<int>qs(const vector<int>& v)
{
    vector<int>nums = v;
    int n = nums.size();
    helper(nums,0,n-1);
    return nums;
   
}

void heapify(vector<int>& nums,int n,int i)
{
    int largest = i;
    int l = 2 * i + 1;
    int r = 2 * i + 2;
    while(l < n && nums[largest] < nums[l])
    {
        largest = l;
    }
    while(r < n && nums[largest] < nums[r])
    {
        largest = r;
    }
    if(largest != i)
    {
        swap(nums[largest],nums[i]);
        heapify(nums,n,largest);

    }
}

vector<int>hpS(const vector<int>& boxes)
{
    vector<int>nums = boxes;
    int n = nums.size();
    for(int i = n / 2 - 1; i >= 0; --i)
    {
        heapify(nums,n,i);
    }
    for(int i = n-1; i>=0;--i)
    {
        swap(nums[0],nums[i]);
        heapify(nums,i,0);
    }
    return nums;
}

int reverse(int num)
{
    int ret = 0;
    while(num != 0)
    {
        int temp = ret * 10 + num % 10;
        if (temp / 10 != ret)
            return 0;
        ret = temp;
        num /= 10;
    }
    return ret;
}

int reverse1(int x)
{
    int ret = 0;
    while(x!=0)
    {
        int tmp = ret * 10 + x % 10;
        if(tmp / 10 != ret)
        {
            return 0;
        }
        ret = tmp;
        x /= 10;
    }
    return ret;
}

int trap(const vector<int>& height)
{
    int res = 0;
    int n = height.size();
    vector<int>left(n),right(n);
    left[0] = height[0];
    right[n-1] = height[n-1];
    for(int i = 1; i < n; ++i)
    {
        left[i] = max(height[i],left[i-1]);        
    }
    for(int i = n - 2; i >= 0; --i)
    {
        right[i] = max(height[i],right[i+1]);
    }
    for(int i = 0; i < n; ++i)
    {
        res += min(left[i],right[i]) - height[i];
    }
    return res;
}

int trapI(const vector<int>& nums)
{
    stack<int>st;
    int res = 0, n = nums.size();
    for(int i = 0; i < n ;++i)
    {
        while(!st.empty() && nums[i] > nums[st.top()])
        {
            int pre = st.top();
            st.pop();
            if(st.empty())break;
            int minHeight = min(nums[i],nums[st.top()]);
            res += (minHeight - nums[pre]) * ( i - st.top() - 1);
        }
        st.push(i);
    }
    return res;
}


int rain(const vector<int>& height)
{
    int n = height.size(),res = 0;
    vector<int>left(n),right(n);
    left[0] = height[0];
    right[n-1] = height[n-1];
    for(int i = 1; i < n; ++i)
    {
        left[i] = max(height[i],left[i-1]);
    }
    for(int i = n - 1; i >= 0; --i)
    {
        right[i] = max(height[i],right[i+1]);
    }
    for(int i = 0; i < n; ++i)
    {
        res += min(left[i],right[i]) - height[i];
    }
    return res;
}

int rainI(const vector<int>& nums)
{
    stack<int>st;
    int res = 0,n = nums.size();
    for(int i = 0; i < n; ++i)
    {
        while(!st.empty() && nums[i] > nums[st.top()])
        {
            int pre = st.top();
            st.pop();
            if(st.empty())break;
            int minHeight = min(nums[i],nums[st.top()]);
            res += (minHeight - nums[pre]) * (i - st.top() - 1);
            // res += (minHeight - nums[pre]) * ( i - st.top() - 1); 
        }
        st.push(i);
    }
    return res;
}

LinkNode* detectCycleNode(LinkNode* head)
{
    LinkNode* slow = head, *fast = head;
    while(fast != nullptr && fast->next != nullptr)
    {
        fast = fast->next->next;
        slow = slow->next;
        if(fast == slow)
        {
            fast = head;
            while(fast != slow)
            {
                fast = fast->next;
                slow = slow->next;
            }
            return slow;
        }
    }
    return nullptr;
}

 void moveZeroes(vector<int>& nums) {
    int n = nums.size();
    if(1 == n)return;
    for(int zero=0,nonzero =1 ;nonzero < n && zero < n; ++nonzero)
    {
        if(nums[nonzero]!=0 && nums[zero]==0)swap(nums[zero],nums[nonzero]);
        while(nums[zero]!=0 && zero < nonzero)++zero;
    }            
}    

void levelOrder(TreeNode* root,vector<vector<int>>& res)
{
    queue<TreeNode*>q;
    if(root != nullptr)q.push(root);
    while(!q.empty())
    {
        int size = q.size();
        vector<int>tmp;
        for(int i = 0; i < size; ++i)
        {
            auto cur = q.front();
            q.pop();
            tmp.push_back(cur->val);
            if(cur->left)q.push(cur->left);
            if(cur->right)q.push(cur->right);
        }
        res.push_back(tmp);
    }
    return ;
}


int maxProfit_II(const vector<int>& prices)
{
    if(prices.empty())return 0;
    int n = prices.size();
    vector<vector<int>>dp(n,vector<int>(2));
    dp[0][0] = 0;
    dp[0][1] = -prices[0];
    for(int i = 1; i < n; ++i)
    {
        dp[i][1] = max(dp[i-1][1],dp[i-1][0] - prices[i]);
        dp[i][0] = max(dp[i-1][0],dp[i-1][1] + prices[i]);
    }
    return dp[n-1][0];

}

int maxProfit_II_greedy(const vector<int>& prices)
{
    if(prices.empty())return 0;
    int n = prices.size();
    int profit = 0;
    for(int i = 1; i < n; ++i)
    {
        if(prices[i-1] < prices[i])
        {
            profit += (prices[i] - prices[i-1]);
        }
    }
    return profit;
}

bool isValid(const string s)
{
    stack<char>st;
    for(char c : s)
    {
        if(c == '(')
        {
            st.push(')');
        }
        else if(c == '{')
        {
            st.push('}');
        }
        else if(c == '[')
        {
            st.push(']');
        }
        else if(st.empty() || st.top() != c)
        {
            return false;
        }
        else
        {
            st.pop();
        }
        
    }
    return st.empty();
}

bool isValid1(string s)
{
    stack<char>st;
    for(int i = 0; i < s.size(); ++i)
    {
        char c = s[i];
        if(c == '[')st.push(']') ;       
        else if(c == '{')st.push('}');
        else if(c == '(')st.push(')');
        else if(st.empty() || st.top() != c)return false;
        else st.pop();
    }
    return st.empty();
}

//  bool isMatch(string s, string p) {
//         bool dp[s.length()+1][p.length()+1] = {};
//         dp[s.length()][p.length()] = 1;
//         for (int i = s.length(); i >= 0; i--){
//             for (int j = p.length() - 1; j >= 0; j--){
//                 bool first_match = i < s.length() && (p[j] == s[i] || p[j] == '.');
//                 if (j + 1 < p.length() && p[j+1] == '*'){
//                     dp[i][j] = dp[i][j+2] || first_match && dp[i+1][j];
//                 } 
//                 else {
//                     dp[i][j] = first_match && dp[i+1][j+1];
//                 }
//             }
//         }
//         return dp[0][0];
//     }

// bool isMatchI(string s,string p)
// {
//     int m = s.size(), n = p.size();
//     bool dp[m+1][n+1];
//     dp[m][n] = 1;
//     for(int i = m; i >=0; --i)
//     {
//         for(int j = n - 1;j >= 0;--j)
//         {
//             bool first_match = i < m && (s[i] == p[j] || p[j] == '.');
//             if(j + 1 < p.size() && p[j+1] == '*')
//             {
//                 dp[i][j] = dp[i][j+2] || first_match && dp[i+1][j];
//             }
//             else
//             {
//                 dp[i][j] = first_match && dp[i+1][j+1];
//             }
//         }
//     }
//     return dp[0][0];

// }

bool isMatch(string s, string p)
{
    int m = s.size(), n = p.size();
    bool dp[m+1][n+1];
    dp[m][n] = 1;
    for(int i = n; i >= 0; --i)
    {
        for(int j = n - 1; j >= 0; --j)
        {
            bool first_match = i < m && (s[i] == p[j] || p[j] == '.');
            if(j+1 < n && p[j+1] == '*')
            {
                dp[i][j] = dp[i][j+2] || first_match && dp[i+1][j];
            }
            else
            {
                dp[i][j] = first_match && dp[i+1][j+1];
            }
        }
    }
    return dp[0][0];
}

int maxVal = INT_MIN;

int helper(TreeNode* root)
{
    if(root == nullptr)return 0;
    int left = max(0, helper(root->left));
    int right = max(0,helper(root->right));
    maxVal = max(maxVal,left + right + root->val);
    return max(left,right) + root->val;
}

int maxSum(TreeNode* root)
{
    helper(root);
    return maxVal;
}

int removeDuplicates(vector<int>& nums) {
        int n = nums.size();
        if(n <= 1)
            return n;
        
        int i = 0;
        for(int j = 1; j < n; ++j){
            if(nums[j] != nums[i]){
                i++;
                nums[i] = nums[j];
            }
        }
        for(;i + 1 < n; ++i)
        {
            nums[i+1] = 0;
        }
        return i+1;
}
int romanToInt(string s) 
{
    int ral = 0;
    unordered_map<char, int>bp = { { 'I',1 },{ 'V', 5 },{ 'X', 10 },{ 'L' , 50 },{ 'C' , 100 },{ 'D' , 500 },{ 'M' , 1000 } };
    int s_size = s.size();
    for (int i = 0; i < s_size; i++)
    {
        int res = bp[s[i]];
        if (i == s_size - 1 || bp[s[i + 1]] <= bp[s[i]]) ral += res;
        else ral -= res;
    }
    return ral;
}

void backtrackI(const vector<int>& candidates,int target,vector<int>&path,vector<vector<int>>&res,int sum, int index)
{
    if(sum > target)return;
    if(sum == target)
    {
        res.push_back(path);
        return;
    }
    for(int i = index ; i < candidates.size(); ++i)
    {
        sum += candidates[i];
        path.push_back(candidates[i]);
        backtrackI(candidates,target,path,res,sum,i);
        path.pop_back();
        sum -= candidates[i];
    }

}

int subarraySum(const vector<int>& nums,int target)
{
    unordered_map<int,int>map;
    int sum = 0, res = 0;
    map[0] = 1;
    for(int num:nums)
    {
        sum += num;
        if(map.count(sum - target))res+=map[sum - target];
        ++map[sum];
    }
    return res;
}


vector<vector<int>>combinationSum(const vector<int>& candidates, int target)
{
    vector<vector<int>>res;
    vector<int>path;
    backtrackI(candidates,target,path,res,0,0);
    return res;
}

bool hasCycleNode(LinkNode* head)
{
    LinkNode* slow = head, *fast = head;
    while(fast != nullptr && fast->next != nullptr)
    {
        slow = slow->next;
        fast = fast->next->next;
        if(slow == fast) return true;
    }
    return false;
}

bool cmp1(pair<int,int>p1,pair<int,int>p2)
{
    return p1.first < p2.first;
}

vector<pair<int,int>>merge(vector<pair<int,int>>& intervals)
{
    vector<pair<int,int>>res;
    int n = intervals.size();
    if(n == 0)return res;
    sort(intervals.begin(),intervals.end(),cmp1);   
    auto cur = intervals[0];
    for(auto next : intervals)
    {
        if(cur.second >= next.first)cur.second = max(cur.second,next.second);
        else
        {
            res.push_back(cur);
            cur = next;
        }
    }
    res.push_back(cur);
    return res;
}

int str2int(string str)
{
    if(str.empty())return 0;
    int len = str.size();
    int pos = str.find_first_not_of(" ");
    if(-1 != pos)str = str.substr(pos,len - pos + 1);
    bool flag = false;
    long long res = 0;
    if((str[0] <= '9' && str[0] >= 0) || str[0] == '+' || str[0] == '-')
    {
        int i = 0;
        if('+' == str[0])i = 1;
        else if('-' == str[0]){
            i = 1;
            flag = true;
        } 
        for(;i < str.size(); ++i)
        {
            if(str[i] <= '9' && str[i] >= '0')
            {
                res = res * 10 + (str[i]-'0');
                if(res > INT_MAX)
                {
                    if(flag)return INT_MIN;
                    else return INT_MAX;
                }
            }
            else break;
        }
    }
    else return 0;
    if(flag)
    {
        res = -res;
    }
    return res;
}

int preOrderIndex = 0;
TreeNode* help(vector<int>&pre,int start,int end,unordered_map<int,int>&map)
{
    if(start > end)return nullptr;
    TreeNode* root = new TreeNode(pre[preOrderIndex++]);
    int index = map[root->val];
    root->left = help(pre,start,index-1,map);
    root->right = help(pre,index+1,end,map);
    return root;
}

TreeNode* buildTreeFromPreIn(vector<int>&pre,vector<int>&in)
{
    int N = pre.size();
    unordered_map<int,int>map;
    for(int i = 0; i < N; ++i)
    {
        map[in[i]] = i;
    }
    return help(pre,0,N-1,map);
}

int removeDuplicatesI(vector<int>& nums)
{
    int n = nums.size();
    int i = 0;
    for(int j = 1; j < n; ++j)
    {
        if(nums[i]!=nums[j])
        {
            nums[i++] = nums[j];
        }
    }
    for(;i + 1 < n; ++i)
    {
        nums[i+1] = 0;
    }
    return i+1;
}

int singleNum0(const vector<int>& nums)
{
    int res = 0;
    for(auto & num :nums)
    {
        res ^= num;
    }
    return res;
}
// void dfs(int left, int right, string level,vector<string>&res)
// {
//     if(left > right)return;
//     if(left == 0 && right == 0)res.emplace_back(level);
//     if(left > 0)dfs(left - 1, right,level + "(",res);
//     if(right > 0)dfs(left,right - 1,level+")",res);
//     return ;

// }

// vector<string> generateParentheses(int n)
// {
//     vector<string>res;
//     dfs(n,n,"",res);
//     return res;
// }

void dfs(int left, int right, string tmp,vector<string>&res)
{
    if(left > right)return;
    if(0 == left && 0 == right)res.emplace_back(tmp);
    if(left > 0)dfs(left-1,right,tmp + "(",res);
    if(right > 0)dfs(left,right-1,tmp +")",res);
    return;
}
vector<string> gen(int n)
{
    vector<string>res;
    dfs(n,n,"",res);
    return res;
}

vector<int>singleNum(vector<int>& nums)
{
    int res = 0;
    for(int i = 0; i < nums.size(); ++i)
    {
        res ^= nums[i];
    }
    int tmp = 1;
    while((res & tmp) == 0)
    {
        tmp <<= 1;
    }        
    int ans2 = 0;
    for(int i = 0; i < nums.size(); ++i)
    {
        if((tmp&nums[i])!= 0)
        {
            ans2 ^= nums[i];
        }
    }        

        vector<int> rtn;
        rtn.push_back(ans2);
        rtn.push_back(ans2 ^ res);
        return rtn;


}

string convert(string s, int numRows) {
    if(numRows <= 1)return s;
    vector<string>zigzag(min(numRows,static_cast<int>(s.size())));
    int curRow = 0;
    bool goDown = false;        
    for(int i = 0; i < s.size(); ++i)
    {
        zigzag[curRow]+=s[i];
        if(0 == curRow || curRow == numRows - 1)goDown = !goDown;
        curRow+=goDown?1:-1;

    }        
    string res("");
    for(auto &str:zigzag)res+=str;
    return res;
}

void print(const vector<pair<int,int>>& vs)
{
    for(auto v:vs)
    {
        cout << v.first << " " << v.second << endl;
    }
}



vector<int>maxSlidingWindow(const vector<int>& nums,int k)
{
    int n = nums.size();
    deque<int>q;
    vector<int>res(n-k+1);
    for(int i = 0; i < n; ++i)
    {
        int start = i-k+1;
        while(!q.empty() && i - q.front() >= k)q.pop_front();
        while(!q.empty() && nums[q.front()] <= nums[i])q.pop_back();
        q.push_back(i);
        if(start >= 0)res[start] = nums[q.front()];
    }
    return res;
}

int singleNumberI(vector<int>& nums) 
{
    vector<int>bits(32,0);
    for(int i = 0; i < nums.size(); ++i)
    {
        for(int j = 0; j < 32; ++j)
        {
            if(nums[i] &(1 << j))
            ++bits[j];
        }
    }        
    int res = 0;
    for(int i = 0; i < bits.size(); ++i)
    {
        if(bits[i]%3 == 1)
        {
            res += (1 << i);
        }
    }        
    return res;
}

bool canJump(const vector<int>& nums)
{
    if(nums.size() == 1)return true;
    int cover = 0;
    for(int i = 0; i < nums.size(); ++i)
    {
        cover = max(i + nums[i],cover);
        if(cover >= nums.size() - 1)return true;
    }
    return false;
}

int uniquePathsI(int m, int n)
{
    vector<int>dp(n,1);
    for(int i = 1; i < m; ++i)
    {
        for(int j = 1; j < n; ++j)
        {
            dp[j] = dp[j] + dp[j-1];
        }
    }
    return dp[n-1];
}

int uniquePaths(int m, int n)
{
    vector<vector<int>>dp(m,vector<int>(n));
    for(int i = 0;i < m; ++i)
    {
        dp[i][0] = 1;
    }
    for(int i = 0; i < n; ++i)
    {
        dp[0][i] = 1;
    }
    for(int i = 1; i < m; ++i)
    {
        for(int j = 1; j < n ; ++j)
        {
            dp[i][j] = dp[i-1][j] + dp[i][j-1];
        }
    }
    return dp[m-1][n-1];
}

int searchInsert(vector<int>& nums, int target){
    int left=0;
    int numsSize = nums.size();
    int right=numsSize-1;
    if(nums[right] < target)
        return numsSize;
    if(nums[right] == target)
        return right;
    if(nums[left] >= target)
        return left;
    while(nums[left]<target && nums[right]>target)
    {
        int mid = left + (right - left) / 2;
        if(mid==left)
        {
            return right;
        }
        if(nums[mid]>target)
        {
            right=mid;
        }
        if(nums[mid]<target)
        {
            left=mid;
        }
        if(nums[mid]==target)
        {
            return mid;
        }
    }
    if(nums[left]<target)
    {
        return right;
    }
    if(nums[right]>target)
    {
        return left;
    }
 
    //最后不要忘记返回噢
    return 0;
}

void print(LinkNode* node)
{    
    while(node != nullptr)
    {
        cout << node->val <<" ";
        node = node->next;
    }
    cout << endl;
}
LinkNode* reverseII(LinkNode* head)
{
    LinkNode* pre = nullptr;
    while(head != nullptr)
    {
        LinkNode* next = head->next;
        head->next = pre;
        pre = head;
        head = next;
    }
    return pre;
}

LinkNode* swapPairs(LinkNode* head) {
    if (nullptr == head || nullptr == head->next)return head;                
    LinkNode* dummy = new LinkNode(0);
    dummy->next = head;
    LinkNode* temp = dummy;
    while(nullptr != temp->next && nullptr != temp->next->next)
    {
        LinkNode* p = temp->next;
        LinkNode* q = temp->next->next;            
        temp->next = q;
        p->next = q->next;
        q->next = p;
        temp = p;
    }
    return dummy->next;
}

LinkNode* reverseIII(LinkNode* head)
{
    LinkNode* pre = nullptr;
    while(head != nullptr)
    {
        LinkNode* next = head->next;
        head->next = pre;
        pre = head;
        head = next;
    }
    return pre;
}

LinkNode* reverse(LinkNode* head,LinkNode* newHead)
{
    if(nullptr == head)return newHead;
    LinkNode* next = head->next;
    head->next = newHead;
    return reverse(next,head);
}

LinkNode* mergeTwoLists(LinkNode* l1, LinkNode* l2)
{
    LinkNode* dummy = new LinkNode(0);
    LinkNode* cur = dummy;
    while(nullptr != l1 && nullptr != l2)
    {
        if(l1->val < l2->val)
        {
            cur->next = new LinkNode(l1->val);
            l1 = l1->next;
        }
        else
        {
            cur->next = new LinkNode(l2->val);
            l2 = l2->next;
        }
        cur = cur->next;
    }
    cur->next = l1 == nullptr ? l2:l1;
    return dummy->next;
}

int climbStairs(int n)
{
    if(n <= 2)return n;
    vector<int>dp(n+1);
    dp[1] = 1;
    dp[2] = 2;
    for(int i = 3; i <= n; ++i)
    {
        dp[i] = dp[i-1] + dp[i-2];
    }
    return dp[n];
}

void reverse(vector<int>& nums, int start, int end) {
    while(start < end)
    {
        int tmp = nums[start];
        nums[start] = nums[end];
        nums[end] = tmp;
        ++start;
        --end;
    }
}

void inorder(TreeNode* root)
{
    if(root == nullptr)return;
    inorder(root->left);
    cout << root->val << endl;
    inorder(root->right);
}
void inorder(TreeNode* root, vector<int>&res)
{
    stack<TreeNode*>st;
    while(root != nullptr || !st.empty())
    {
        while(root != nullptr)
        {
            st.push(root);
            root = root->left;
        }
        root = st.top();
        st.pop();
        res.push_back(root->val);
        root = root->right;
    }
}


void rotate(vector<int>& nums,int k)
{
    k %= nums.size();
    reverse(nums,0,nums.size() - 1); 
    reverse(nums,0,k-1);
    reverse(nums,k,nums.size() - 1);
}

string letterMap[10]={
    "",
    "",
    "abc",
    "def",
    "ghi",
    "jkl",
    "mno",
    "pqrs",
    "tuv",
    "wxyz"};

void backtrack(const string & digits, string& s, vector<string>& res,int index)
{
    if(s.size() == digits.size())
    {
        res.push_back(s);
        return;
    }
    int digit = digits[index] - '0';
    string letter = letterMap[digit];
    for(int i = 0; i < letter.size(); ++i)
    {
        s.push_back(letter[i]);
        backtrack(digits,s,res,index + 1);
        s.pop_back();
    }
}

vector<string> letterCombinations(const string& digits)
{
    vector<string>res;
    if(digits.size() == 0)return res;
    string s;
    backtrack(digits,s,res,0);
    return res;
}

int climbStairs_m(int n,int m)
{
    vector<int>dp(n+1,0);
    dp[0] = 1;
    for(int i = 1; i <= n; ++i)
    {
        for(int j = 1;j <=  m; ++j)
        {
            if(i - j >= 0)dp[i]+=dp[i-j];
        }
    }
    return dp[n];    
}

int lengthOfList(const vector<int>& nums)
{
    int n = nums.size();
    if(n <= 1)return n;
    vector<int>dp(n,1);    
    for(int i = 1; i < n ; ++i)
    {
        for(int j = 0; j < i; ++j)
        {
            if(nums[i] > nums[j])dp[i] = max(dp[i],1 + dp[j]);
        }
    }    
    return *max_element(dp.begin(),dp.end());
}


int maxProfit(const vector<int>& prices)
{
    int n = prices.size();
    if(0 == n)return 0;
    vector<vector<int>>dp(n,vector<int>(2,0));
    dp[0][0] = 0;
    dp[0][1] = -prices[0];    
    for(int i = 1; i < prices.size(); ++i)
    {
        dp[i][0] = max(dp[i-1][1] + prices[i],dp[i-1][0]);
        dp[i][1] = max(dp[i-1][1],-prices[i]);
    }    
    return dp[n-1][0];
}

int getleftposition(vector<int>& nums,int target)
{
    int left = 0, right = nums.size() - 1;
    while(left <= right)
    {
        int mid = left + ((right - left )>> 1);
        if(target > nums[mid])left = mid + 1;
        else if(target < nums[mid])right = mid - 1;
        else right = mid - 1;     
    }
    if(left == nums.size() || nums[left] != target)
    return -1;
    return left;
}

int getrightposition(vector<int>&nums,int target)
{
    int left = 0,right = nums.size() - 1;
    while(left <= right)
    {
        int mid = left + ((right - left) >> 1);
        if(target < nums[mid])right = mid - 1;
        else if(target == nums[mid])left = mid + 1;
        else left = mid + 1;
    }
    if(right == -1 || nums[right]!=target)return -1;
    return right;
}

vector<int> searchRange(vector<int>& nums, int target) {
    vector<int>ans(2,-1);
    ans[0] = getleftposition(nums,target);
    ans[1] = getrightposition(nums,target);        
    return ans;
}

int coinChange(const vector<int>&nums,int amount)
{
    vector<int>dp(amount + 1,INT_MAX);
    dp[0] = 0;
    for(int i = 0; i < nums.size(); ++i)
    {
        for(int j = nums[i];j <= amount; ++j)
        {
            if(dp[j - nums[i]]!= INT_MAX)
            {
                dp[j] = min(dp[j],dp[j-nums[i]] + 1);
            }
        }
    }
    if(dp[amount] == INT_MAX)return -1;
    return dp[amount];
}

void nextPermutation(vector<int>& nums)
{
    int i = nums.size() - 2;
    while(i >= 0 && nums[i] >= nums[i+1])
    {
        --i;
    }
    if(i >= 0)
    {
        int j = nums.size() - 1;
        while(i < j && nums[i] >= nums[j])
        --j;
        int tmp = nums[j];
        nums[j] = nums[i];
        nums[i] = tmp;
    }
    int end = nums.size() - 1;
    int start = i + 1;
    while(start < end)
    {
        int tmp = nums[end];
        nums[end] = nums[start];
        nums[start] = tmp;
        --end;
        ++start;
    }
    return;
}

// int minEditDistance(string s, string t)
// {
//     int m = s.size(), n = t.size();
//     vector<vector<int>>dp(m+1,vector<int>(n+1,0));
//     for(int i = 0; i < m; ++i)dp[i][0] = i;
//     for(int j = 0; j < n; ++j)dp[0][j] = j;
//     for(int i = 1; i <= m; ++i)
//     {
//         for(int j = 1; j <= n; ++j)
//         {
//             if(s[i-1] == t[j-1])
//             {
//                 dp[i][j] = dp[i-1][j-1];
//             }
//             else{
//                 dp[i][j] = min({dp[i-1][j-1],dp[i][j-1],dp[i-1][j]}) + 1;
//             }
//         }
//     }    
//     return dp[m][n];
// }

int jump(const vector<int>& nums)
{
    int step = 0,maxReach = 0,end = 0;
    for(int i = 0; i < nums.size(); ++i)
    {
        maxReach = max(maxReach,nums[i] + i);
        if(i == end)
        {
            ++step;
            end = maxReach;
        }
    }
    return step;
}

bool wordBreak(string s, const vector<string>& wordDict)
{
    vector<bool>dp(s.size() + 1, false);
    unordered_set<string>set(wordDict.begin(),wordDict.end());
    dp[0] = true;
    for(int i = 1; i <= s.size(); ++i)
    {
        for(int j = 0; j < i; ++j)
        {
            string word = s.substr(j,i - j);
            if(set.find(word)!= set.end()&&dp[j])
            {
                dp[i] = true;
            }
        }
    }
    return dp[s.size()];
}

int minEditDistance(string s1,string s2)
{
    int m = s1.size(),n = s2.size();
    vector<vector<int>>dp(m+1,vector<int>(n+1,0));
    for(int i = 0; i < m ;++i)
    {
        dp[i][0] = i;
    }
    for(int j = 0; j < n; ++j)
    {
        dp[0][j] = j;
    }
    for(int i = 1; i <= m; ++i)
    {
        for(int j =1; j <= n; ++j)
        {
            if(s1[i-1] == s2[j-1])
            {
                dp[i][j]=dp[i-1][j-1];
            }
            else
            {
                dp[i][j] = min({dp[i-1][j-1],dp[i-1][j],dp[i][j-1]} ) + 1;
            }
        }
    }
    return dp[m][n];
}

string longestCommonPrefix(vector<string>& strs) {
    string res = "";
    if(strs.size() == 0)return res;        
    sort(strs.begin(),strs.end());        
    for(int i = 0; i < strs[0].size();++i)
    {
        char tmp = strs[0][i];
        int j = 1 ;
        for(j = 1; j < strs.size();++j)
        {
            if(tmp != strs[j][i])break;
        }
        if(j >= strs.size())res += tmp;
        else break;
    }        
    return res;     
}


int rob(const vector<int>& nums)
{
    int n = nums.size();
    if(n == 0)return 0;
    if(n ==1) return nums[0];
    vector<int>dp(n,INT_MIN);    
    dp[0] = nums[0];
    dp[1] = max(nums[0],nums[1]);    
    for(int i = 2; i < n; ++i)
    {
        dp[i] = max(dp[i-1],dp[i-2]+nums[i]);
    }    
    return dp[n-1];    
}

LinkNode* endOfFirst(LinkNode* head)
{
    LinkNode* slow = head;
    LinkNode* fast = head;
    while(fast->next != nullptr && fast->next->next != nullptr)
    {
        fast = fast->next->next;
        slow = slow->next;
    }
    return slow;
}

LinkNode* reverse(LinkNode* head)
{
    LinkNode* pre = nullptr;
    while(head != nullptr)
    {
        LinkNode* next = head->next;
        head->next = pre;
        pre = head;
        head = next;
    }
    return pre;
}

bool isPalindrome(LinkNode* head)
{

    LinkNode* firstHead = endOfFirst(head);
    LinkNode* second = reverse(firstHead->next);
    LinkNode* p1 = head;
    LinkNode* p2 = second;
    bool result = true;
    while(result && p2 != nullptr)
    {
        if(p1->val != p2->val)return false;
        p1 = p1->next;
        p2 = p2->next;
    }
    firstHead->next = reverse(second);
    return result;
}

bool isPalindrome(int x)
{
    if(x < 0 || (x > 0 && (x % 10) == 0))return false;
    int reverse = 0;    
    while(x > reverse)
    {
        reverse = reverse * 10 + x % 10;
        x /= 10;
    }    
    return (x == reverse || x == reverse / 10);    
}

int largestRectangle(vector<int>& height)
{
    stack<int>st;
    int res = 0;
    for(int i = 0; i < height.size(); ++i)
    {
        while(!st.empty() && height[i] <= height[st.top()])
        {
            int preHeight = height[st.top()];
            st.pop();
            int width = i - (st.empty() ? 0:st.top() + 1);
            res = max(res,preHeight * width);
        }
        st.push(i);
    }
    while(!st.empty())
    {
        int preHeight = height[st.top()];
        st.pop();
        int width = height.size() - (st.empty() ? 0 :st.top() + 1);
        res = max(res,preHeight * width);
    }
    return res;
}

int maxRectangle(const vector<vector<string>>& matrix)
{
    int m = matrix.size();
    if(m == 0)return 0;
    int n = matrix[0].size();
    vector<int>height(n);
    int res = 0;
    for(int i = 0; i < m; ++i)
    {
        for(int j = 0;j < n; ++j)
        {
            if(matrix[i][j] == "0")height[j]=0;
            else ++height[j];        
        }
        res = max(res,largestRectangle(height));
    }
    return res;
}

int longestValidParentheses(string s) {
    int res = 0;
    stack<int>st;
    st.push(-1);
    for(int i = 0;i < s.size(); ++i)
    {
        char c =s[i];
        if(c == '(')
        {
            st.push(i);
        }
        else
        {
            st.pop();
            if(st.empty())st.push(i);
            else
            res = max(res, i - st.top());
        }
    }
    return res;
}

// LinkNode* removeNthFromEnd(LinkNode* head,int n)
// {
//     LinkNode dummy(0);
//     dummy.next = head;
//     LinkNode* first = &dummy, *second = &dummy;
//     for(int i = 1; i <= n + 1; ++i)
//     {
//         first = first->next;
//     }
//     while(first != nullptr)
//     {
//         first = first->next;
//         second = second->next;
//     }
//     second->next = second->next->next;
//     return dummy.next;
// }

LinkNode* reverseKGroup(LinkNode* head, int k)
{
    LinkNode* node = head;
    int cnt = 0;
    while(cnt < k)
    {        
        if(nullptr == node)return head;
        node = node->next;
        ++cnt;        
    }    
    LinkNode* pre = reverseKGroup(node,k);
    while(cnt-- > 0)
    {
        LinkNode* next = head->next;
        head->next = pre;
        pre = head;
        head = next;
    }       
    return pre;    
}


LinkNode* removeNthFromEnd(LinkNode* head, int n)
{
    LinkNode* dummy = new LinkNode(0);
    dummy->next = head;
    LinkNode* first = dummy, *second = dummy;
    for(int i = 1; i <= n + 1; ++i)
    {
        first = first->next;
    }
    while(first != nullptr)
    {
        first = first->next;
        second = second->next;
    }
    second->next = second->next->next;
    return dummy->next;
}

int search(vector<int>& nums, int target) {
    int left = 0, right = nums.size() - 1;
    while(left <= right)
    {
        int mid = left + (right - left) / 2;
        if(nums[mid]==target)return mid;
        else if(nums[left] <= nums[mid])
        {
            if(nums[left] <= target && nums[mid] >= target)right = mid -1;
            else left = mid + 1;
        }
        else
        {
            if(nums[mid] <= target && nums[right] >= target)left = mid + 1;
            else right = mid - 1;            
        }
    }             
    return -1;
}

bool isContain(const vector<int>& nums,int val)
{
    for(auto &num : nums)
    {
        if(num == val)return true;
    }
    return false;
}

void help(vector<int>& nums,vector<vector<int>>&res,vector<int>&tmp,int index)
{
    if(tmp.size() == nums.size())res.emplace_back(tmp);
    else
    {
        for(int i = 0; i < nums.size(); ++i)
        {
            if(isContain(tmp,nums[i]))continue;
            tmp.emplace_back(nums[i]);
            help(nums,res,tmp,index + 1);
            tmp.pop_back();
        }
    }        
}

int majorNum(const vector<int>& nums)
{
    int major = 0,res = 0;
    unordered_map<int,int>m;
    for(auto & num:nums)
    {
        ++m[num];
        if(m[num] > major)
        {
            major = m[num];
            res = num;
        }
    }
    return res;
}

vector<vector<int>>permute(vector<int>& nums)
{
    vector<vector<int>>res;
    vector<int>tmp;
    sort(nums.begin(),nums.end());
    help(nums,res,tmp,0);
    return res;
}
void print(const vector<vector<int>>& nums)
{
    for(auto && num : nums)
    {
        for(auto && n : num)
        {
            cout << n << " ";
        } 
        cout << endl;
    }
    
}

bool compare(TreeNode* left, TreeNode* right)
{
    if(nullptr == left && nullptr != right)return false;
    else if(nullptr == right && nullptr != left)return false;
    else if(nullptr == left && nullptr == right)return true;
    else if(left->val != right->val)return false;
    bool outside = compare(left->left,right->right);
    bool inside = compare(left->right,right->left);
    return inside && outside;
    
}

bool isSymmetric(TreeNode* root)
{
    if(root == nullptr)return true;
    return compare(root->left,root->right);
}

bool isSymmetric_stack(TreeNode* root)
{
    if(nullptr == root)return true;
    stack<TreeNode*>st;
    st.push(root->left);
    st.push(root->right);
    while(!st.empty())
    {
        TreeNode* leftNode = st.top();st.pop();
        TreeNode* rightNode = st.top();st.pop();
        if(!leftNode && !rightNode)continue;
        if(!leftNode || !rightNode || leftNode->val != rightNode->val)return false;
        st.push(leftNode->left);
        st.push(rightNode->right);
        st.push(leftNode->right);
        st.push(rightNode->left);
    }
    return true;
}

bool isSymmetric_queue(TreeNode* root)
{
    if(root == nullptr)return true;
    queue<TreeNode*>q;
    q.push(root->left);
    q.push(root->right);
    while(!q.empty())
    {
        TreeNode* leftNode = q.front();q.pop();
        TreeNode* rightNode = q.front();q.pop();
        if(!leftNode && !rightNode)continue;
        if(!leftNode || !rightNode || (leftNode->val != rightNode->val))
        return false;
        q.push(leftNode->left);
        q.push(rightNode->right);
        q.push(leftNode->right);
        q.push(rightNode->left);
    }
    return true;
}

int largestRectangleArea(const vector<int>& nums)
{
    stack<int>st;
    int n = nums.size();
    int res = 0;
    for(int i = 0; i < n; ++i)
    {
        while(!st.empty() && nums[i] <= nums[st.top()])
        {
            int pre = st.top();
            st.pop();
            int preHeight = nums[pre];
            int width = i - (st.empty() ? 0 :st.top() + 1);
            res = max(res, preHeight * width);
        }
        st.push(i);
    }
    while(!st.empty())
    {
        int preHieght = nums[st.top()];
        st.pop();
        int width = n - (st.empty() ? 0 : st.top() + 1);
        res = max(res,preHieght * width);
    }
    return res;
}

LinkNode* partition(const vector<LinkNode*>& lists,int start, int end)
{
    if(start == end)return lists[start];
    if(start < end)
    {
        int mid = start + (end - start) / 2;
        auto l1 = partition(lists,start,mid);
        auto l2 = partition(lists,mid+1,end);
        return mergeTwoLists(l1,l2);
    }
    return nullptr;
}

LinkNode* mergeKLists(vector<vector<int>>& lists)
{
    vector<LinkNode*>listss;
    for(int i = 0; i < lists.size(); ++i)
    {        
        listss.push_back(generateLinkNode(lists[i]));
    }    
    return partition(listss,0,lists.size() - 1);
}


void twoSum(const vector<int>& nums,int left,int right,int target,vector<vector<int>>&res)
{
    while(left < right)
    {
        int tmp = nums[left] + nums[right] + target;
        if(0 == tmp)
        {
            res.push_back({target,nums[left++],nums[right--]});
            while(left < right && nums[left] == nums[left-1])++left;
            while(left < right && nums[right] == nums[right+1])--right;
        }
        else if(tmp>0)--right;
        else ++left;
    }
    return;
}


vector<vector<int>>ThreeSum(vector<int>& nums)
{
    sort(nums.begin(),nums.end());
    vector<vector<int>>res;
    for(int i =  0; i < nums.size() - 2; ++i)
    {
        if(i != 0 && nums[i] == nums[i-1])continue;
        int left = i + 1, right = nums.size() -1;
        twoSum(nums,left,right,nums[i],res);
    }
    return res;
}
void twoSumI(const vector<int>& nums,int left,int right,int target,vector<vector<int>>&res)
{
    while(left < right)
    {
        int tmp = nums[left] +nums[right] + target;
        if(0 == tmp)
        {
            res.push_back({target,nums[left++],nums[right--]});
            while(left < right && nums[left] == nums[left - 1])++left;
            while(left < right && nums[right] == nums[right + 1])--right;
        }
        else if(0 < tmp)--right;
        else ++left;
    }
    return;
}


vector<vector<int>>ThreeSum2(vector<int>&nums)
{
    sort(nums.begin(),nums.end());
    vector<vector<int>>res;
    for(int i = 0 ; i < nums.size() - 2; ++i)
    {
        if(i!=0 && nums[i] == nums[i-1])continue;
        int left = i + 1, right = nums.size() - 1;
        twoSumI(nums,left,right,nums[i],res);   
    }
    return res;
}


int maxSubArray(const vector<int>& nums)
{
    
    int res = INT_MIN,sum = 0, n = nums.size();
    for(int i = 0; i < n; ++i)
    {
        sum += nums[i];
        res = max(res,sum);
        if(sum < 0) sum = 0;
    }
    return res;
}


int maxSubArray0(const vector<int>& nums)
{
    int maxSum = INT_MIN,maxEnd = 0, n = nums.size();
    for(int i = 0; i < n; ++i)
    {
        maxEnd += nums[i];
        maxSum = max(maxSum,maxEnd);
        if(maxEnd < 0) maxEnd = 0;
    }
    return maxSum;
}

int findDuplicate(const vector<int>&nums)
{
    int slow = nums[0],fast = nums[nums[0]];
    while(slow != fast)
    {
        slow = nums[slow];
        fast = nums[nums[fast]];
    }
    int p1 = nums[0];
    int p2 = nums[slow];
    while(p1 != p2)
    {
        p1 = nums[p1];
        p2 = nums[p2];
    }
    return p1;
}

int length(LinkNode* head)
{
    int size = 0;
    while(head != nullptr)
    {
        ++size;
        head = head->next;
    }
    return size;
}

LinkNode* getInersection(LinkNode* headA, LinkNode* headB)
{
    
    int lenA = length(headA), lenB = length(headB);
    while(lenB > lenA)
    {
        headB = headB->next;
        --lenB;
    }
    while(lenA > lenB)
    {
        headA = headA->next;
        --lenA;
    }
    while(headA != nullptr&& headB != nullptr)
    {
        if(headA->val == headB->val)return headA;
        headA = headA->next;
        headB = headB->next;
    }
    return nullptr;    
}

string minWindow(string s, string t)
{
    unordered_map<char,int>map;
    for(char c:t)
    {
        ++map[c];
    }
    int left = 0, minStart = 0, minLen = INT_MAX, cnt = 0;
    for(int i = 0; i < s.size(); ++i)
    {
        char c = s[i];
        if(map.count(c))
        {
            if(map[c]>0)++cnt;
            --map[c];
        }
        while(cnt == t.size())
        {
            if(i - left + 1 < minLen)
            {
                minLen = i - left + 1;
                minStart = left;
            }
            char leftChar = s[left];
            if(map.count(leftChar))
            {
                ++map[leftChar];
                if(map[leftChar] > 0) --cnt;
            }
            ++left;
        }
    }
    if(minLen == INT_MAX)return "";
    return s.substr(minStart,minLen);
}

void dfs(vector<vector<int>>& res,const vector<int>&nums,vector<int>&tmp,int start)
{
    res.emplace_back(tmp);    
    for(int i = start; i < nums.size(); ++i)
    {        
        tmp.emplace_back(nums[i]);
        dfs(res,nums,tmp,i + 1);
        tmp.pop_back();
    }
    return ;
}

vector<vector<int>>subset(const vector<int>& nums)
{
    vector<vector<int>>res;
    vector<int>tmp;
    dfs(res,nums,tmp,0);
    return res;
}

int numTrees(int n)
{
    vector<int>G(n+1);
    G[0] = 1;
    G[1] = 1;
    for(int i = 2; i <= n; ++i)
    {
        for(int j = 1; j <= i; ++j)
        {
            G[i] += G[j-1]*G[i-j];
        }
    }
    return G[n];
}

LinkNode* sortList(LinkNode* head)
{
    if(nullptr == head || nullptr == head->next)
    return head;
    LinkNode* lowHead = new LinkNode(0);
    LinkNode* low = lowHead;
    LinkNode* midHead = new LinkNode(0);
    LinkNode* mid = midHead;
    LinkNode* highHead = new LinkNode(0);
    LinkNode* high = highHead;

    int val = head->val;
    LinkNode* node = head;
    while(nullptr != node)
    {
        if(node->val > val)
        {
            high->next = node;
            high = high->next;
        }
        else if(node->val < val)
        {
            low->next = node;
            low = low->next;
        }
        else{
            mid->next = node;
            mid = mid->next;
        }
        node = node->next;
    }
    low->next = nullptr;
    high->next = nullptr;

    lowHead->next = sortList(lowHead->next);
    highHead->next = sortList(highHead->next);

    low = lowHead;
    while(nullptr != low->next)
    {
        low = low->next;
    }
    low->next = midHead->next;
    mid->next = highHead->next;
    return lowHead->next;

}

int maxProduct(const vector<int>& nums)
{
    int n = nums.size();
    vector<int>maxVal(n), minVal(n);
    int res = nums[0];
    maxVal[0] = nums[0], minVal[0] = nums[0];
    for(int i = 1; i < n; ++i)
    {
        if(nums[i]>0)
        {
            maxVal[i] = max(maxVal[i - 1] * nums[i],nums[i]);
            minVal[i] = min(minVal[i-1] * nums[i],nums[i]);
        }
        else
        {
            maxVal[i] = max(minVal[i - 1] * nums[i],nums[i]);
            minVal[i] = min(maxVal[i-1] * nums[i],nums[i]);            
        }
        res = max(res,maxVal[i]);
    }
    return res;
}

TreeNode* lowestCommonTree(TreeNode* node,TreeNode* p, TreeNode* q)
{
    if(node == nullptr || node == p || node == q)return node;
    TreeNode* left = lowestCommonTree(node->left,p,q);
    TreeNode* right = lowestCommonTree(node->right,p,q);
    if(left != nullptr && right != nullptr)return node;
    else if(left != nullptr && right == nullptr)return left;
    else if(left == nullptr && right != nullptr )return right;
    else return nullptr;
}

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

int numSquares(int n)
{
    vector<int>dp(n+1,INT_MAX);
    dp[0] = 0;
    for(int i = 0; i <= n; ++i)
    {
        for(int j = 1; j * j <= i; ++j)
        {
            dp[i] = min(dp[i],dp[i - j * j]+1);
        }
    }
    return dp[n];
}


int main()
{
    vector<int> nums{10,1,3,3,2,4,5};
    print(qs(nums));
    print(hpS(nums));

    //LeetCode15
    vector<int>nums2{ -1,0,1,2,-1,-4 };
    print(ThreeSum2(nums2));
    // LeetCode53    
    nums = {-2,1,-3,4,-1,2,1,-5,4};
    cout << maxSubArray0(nums) << endl;
    // LeetCode7
    cout << reverse1(-123) << endl;
    //LeetCode11
    vector<int>height{4,2,0,3,2,5};
    cout << trapI(height) << endl;
    
    //LeetCode42
    height = {4,2,0,3,2,5};
    cout << rain(height) << endl;
    cout << rainI(height) << endl;
    

    
    //LeetCode20
    string s1 = "{[]}";
    cout << isValid1(s1) << endl;

    //LeetCode10
    string s = "aab";
    string p = "c*a*b";
    cout << isMatch(s,p) << endl;
    
    //LeetCode26
    nums = {1,2,3,4,4,5,6,6,6};
    removeDuplicatesI(nums);
    for(auto & num:nums)
    {
        cout << num <<" ";
    }
    cout << endl;

    //LeetCode136
    nums = {1,2,2,3,3};
    cout << singleNum0(nums) << endl;
    
    //LeetCode22
    int n = 3;
    print(gen(n));
    nums = {1,1,1,3,3,3,4};
    cout << singleNumberI(nums) <<endl;

    //LeetCode206
    nums = {1,2,3,4,5};
    print(reverseIII(generateLinkNode(nums)));
    print(reverse(generateLinkNode(nums),nullptr));

    // //LeetCode21
    vector<int>l1 = {1,2,4};
    vector<int>l2 = {1,3,4};
    print(mergeTwoLists(generateLinkNode(l1),generateLinkNode(l2)));

    // //LeetCode70 爬楼梯
    cout << climbStairs(3) << endl;
    cout << climbStairs_m(3,2) << endl;//变体为完全背包问题

    // //LeetCode300 递增最长子序列
    nums = {0,1,0,3,2,3};
    cout << lengthOfList(nums) << endl;
    
    // //LeetCode121 买卖股票的最佳时机
    nums = {7,1,5,3,6,4};
    cout << maxProfit(nums) << endl;

    // //LeetCode72 编辑距离
    string s0 = "intention";
    s1 = "execution";
    cout << minEditDistance(s0,s1) << endl;

    // //LeetCode14 最长公共前缀
    vector<string>ss{"fly","flower","flsdf"};
    cout << longestCommonPrefix(ss) << endl;        

    // //打家劫舍
    // //LeetCode198 打家劫舍
    nums = {2,7,9,3,1};
    cout << rob(nums) << endl;

    // //LeetCode9
    int x = 0121;
    cout << isPalindrome(x) << endl;

    // //LeetCode19
    nums = {1,2,3,4,5};
    n = 2;
    LinkNode* node = generateLinkNode(nums);
    print(node);
    print(removeNthFromEnd(node,n));
    
    // //LeetCode33搜索旋转排序数组。
    nums={4,5,6,7,0,1,2};
    cout << search(nums,0) << endl;

    // // LeetCode46
    nums = {1,2,3};
    print(permute(nums));  

    // //LeetCode101
    //LeetCode101对称二叉树
    TreeNode n0(1);
    TreeNode n1(2);
    TreeNode n2(2);
    TreeNode n3(3);
    TreeNode n4(4);
    TreeNode n5(3);
    TreeNode n6(4);
    n0.left = &n1;
    n0.right = &n2;
    n1.left = &n3;
    n1.right = &n4;
    n2.left = &n6;
    n2.right = &n5;
    cout << isSymmetric(&n0) << endl;
    cout << isSymmetric_stack(&n0) << endl;
    cout << isSymmetric_queue(&n0) << endl;

    // //LeetCode84
    height = {2,1,5,6,2,3};
    cout << largestRectangleArea(height) << endl;

    // //LeetCode39 组合总和(可重复)
    vector<int>candidates{2,3,6,7};
    int target = 7;
    print(combinationSum(candidates,target));

    // //LeetCode13罗马数字转整数
    s = "MCMXCIV";
    cout << romanToInt(s) << endl;

    // //LeetCode23合并k个链表
    vector<vector<int>> lists = {{1,4,5},{1,3,4},{2,6}};
    print(mergeKLists(lists));

    // //LeetCode17 电话号码的字母组合
    print(letterCombinations("23"));

    // //LeetCode322 零钱兑换
    vector<int>coins = {1,2,5};
    int amount = 11;
    cout << coinChange(coins,amount) << endl;

    
    // //LeetCode32
    string s4 = ")()())";
    cout << longestValidParentheses(s4) << endl;

    // // LeetCode287
    nums = {1,3,4,2,2};
    cout << findDuplicate(nums) << endl;    
    //LeetCode122
    vector<int>prices{1,2,3,4,5};
    prices = {7,1,5,3,6,4};
    cout << maxProfit_II(prices) <<endl;
    cout << maxProfit_II_greedy(prices) << endl;

    
    //LeetCode160
    vector<int>listA{4,1,8,4,5};
    vector<int>listB{5,6,1,8,4,5};    
    cout << getInersection(generateLinkNode(listA),generateLinkNode(listB))->val << endl;
    
    //LeetCde55 跳跃游戏
    nums = {2,3,1,1,4};
    cout << canJump(nums) << endl;

    //LeetCode76
    s = "ADOBECODEBANC";
    string t = "ABC";
    cout << minWindow(s,t) << endl;
    
    //    LeetCode200
    vector<vector<string>>grid{{"1","1","0","1","1"},{"1","0","1","0","1"},{"1","0","0","0","1"}};    
    cout << numIslands(grid)<<endl;

    //LeetCode78
    nums = {1,2,3};    
    print(subset(nums));

    //LeetCode31
    nums = {1,5,1};
    nextPermutation(nums);
    print(nums);

    //LeetCode96
    cout << numTrees(3) << endl;

    //LeetCode148
    nums = {4,2,1,3};
    node = generateLinkNode(nums);
    node = sortList(node);
    print(node);

     //LeetCode501 二叉搜索树中的众数
    cout << "=====" << endl;
    TreeNode t10(1);
    TreeNode t11(2);
    TreeNode t12(2);
    t10.left = &t11;
    t10.right = &t12;
    //LeetCode236 二叉树的公共祖先
    cout << lowestCommonTree(&t10,&t11,&t12)->val << endl;

    //LeetCode25
    nums = {1,2,3,4,5};
    int k = 2;
    print(reverseKGroup(generateLinkNode(nums),k));

    //LeetCode6
    s = "LEETCODEISHIRING";
    cout << convert(s,4) << endl;

    //LeetCode152
    nums = {2,3,-2,4};
    cout << maxProduct(nums) << endl;

    //LeetCode8 
    cout << str2int(" -1234") << endl;
    
    //LeetCode41
    nums = {1,-1,3,4};
    cout << firstMissingPositive(nums) << endl;
    //LeetCode283
    nums = {0,0,0,1,2,0,3,5,6};
    moveZeroes(nums);
    print(nums);

    //LeetCode141
    LinkNode n11(3);
    LinkNode n22(2);
    LinkNode n33(0);
    LinkNode n44(-4);
    n11.next = &n22;
    n22.next = &n33;
    n33.next = &n44;
    n44.next = &n22;
    cout << hasCycleNode(&n11) << endl;

    //LeetCode98
    TreeNode b0(1);
    TreeNode b1(2);
    TreeNode b2(3);
    b1.left = &b0;
    b1.right = &b2;
    cout << isValidBST(&b1) << endl;

    // LeetCode124
    TreeNode a0(-10);
    TreeNode a1(9);
    TreeNode a2(20);
    TreeNode a3(15);
    TreeNode a4(7);
    a0.left = &a1;
    a0.right = &a2;
    a2.left = &a3;
    a2.right = &a4;
    cout << maxSum(&a0)<<endl;

    //LeetCode105
    vector<vector<int>>tmp;       
    vector<int>preV{3,9,1,2,20,15,7};
    vector<int>inV{1,9,2,3,15,20,7};
    levelOrder(buildTreeFromPreIn(preV,inV),tmp);
    print(tmp);

    //LeetCode34
    nums = {5,7,7,8,8,10};
    target = 8;
    nums = {5,7,7,8,8,10};
    target = 6;
    print(searchRange(nums,target));

    //LeetCode239
    nums={1,3,-1,-3,5,3,6,7};
    k = 3;
    print(maxSlidingWindow(nums,k));
     

    //LeetCode142    
    cout << detectCycleNode(&n11)->val << endl;

    //LeetCode139 单词拆分
    string str = "leetcode";
    vector<string>wordDict{"leet","code"};
    cout << wordBreak(str,wordDict) << endl;

    //LeetCode145
    nums = {2,3,1,1,4};
    cout << jump(nums) << endl;

    //LeetCode169
    nums = {2,2,1,1,1,2,2};
    cout << majorNum(nums) << endl;

    //LeetCode234
    nums = {1,2,2,1};
    cout << isPalindrome(generateLinkNode(nums)) << endl;

    //LeetCode62
    cout << uniquePaths(3,2) << endl;
    cout << uniquePathsI(3,2) << endl;

    //LeetCode189
    nums = {1,2,3,4,5,6,7};
    k = 3;
    rotate(nums,k);
    print(nums);

    //LeetCode94
    TreeNode a(0);
    TreeNode b(1);
    TreeNode c(2);
    TreeNode d(3);
    TreeNode e(4);
    TreeNode f(5);
    TreeNode g(6);
    b.left = &d;
    b.right = &e;
    c.left = &f;
    c.right = &g;
    a.left = &b;
    a.right = &c;
    TreeNode root = a;

    vector<int>res1;    
    inorder(&root);
    inorder(&root,res1);
    print(res1);

     //LeetCode56
    vector<pair<int,int>>intervals{{1,3},{2,6},{8,10},{9,18}};
    print(merge(intervals));

    //LeetCode88

    vector<int>nums1{1,2,3,0,0,0};
    nums2 = {2,5,6};
    int m = 3;
    n = 3;
    merge(nums1,m,nums2,n);
    print(nums1);

    //LeetCode560
    nums = {1,2,3};
    k = 3;
    cout << subarraySum(nums,k) << endl;

     //LeetCode279 完全平方数
    cout << numSquares(12) << endl;

    //LeetCode35
    nums = {1,3,5,6};
    target = 2;
    cout << searchInsert(nums,target) << endl;

    //LeetCode24
    vector<int>head{1,2,3,4};
    print(swapPairs(generateLinkNode(head)));

    //LeetCode85         
    vector<vector<string>>matrix{{"1","0","1","0","0"},{"1","0","1","1","1"},{"1","1","1","1","1"},{"1","0","0","1","0"}};
    cout << maxRectangle(matrix) << endl;

     //LeetCode92
    nums = {1,2,3,4,5};
    int left = 2, right = 4;
    print(reverseBetween(generateLinkNode(nums),left,right));
    return 0;
}

 

标签:return,nums,int,res,next,经典,leetcode,left
来源: https://www.cnblogs.com/fourmi/p/16474949.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有