力扣hot100 61-70记录

61-70
leetcodehot100

cpp 复制代码
class Solution {
private:
    vector<vector<int>> f;
    vector<vector<string>> ret;
    vector<string> ans;
    int n;
public:
    void dfs(const string &s, int i){
        if(i == n) {
            ret.push_back(ans);
            return;
        }
        for(int j = i; j<n; j++){
            if(f[i][j]){
                ans.push_back(s.substr(i, j-i+1));
                dfs(s, j+1);
                ans.pop_back();
            }
        }
    }
    vector<vector<string>> partition(string s) {
        n = s.size();
        f.assign(n, vector<int>(n, true));
        for(int i = n-1; i>=0; i--){
            for(int j = i+1; j<n; j++){
                f[i][j] = (s[i] == s[j]) && f[i+1][j-1];
            }
        }
        dfs(s, 0);
        return ret;        
    }
};//61
cpp 复制代码
class Solution {
public:
    vector<vector<string>> solveNQueens(int n) {
        vector<vector<string>> ans;
        vector<int> queens(n);
        vector<int> col(n), diag1(n*2-1), diag2(n*2-1);
        auto dfs = [&](this auto&& dfs, int r){
            if(r == n){
                vector<string> board(n);
                for(int i = 0; i<n; i++){
                    board[i] = string(queens[i], '.') + 'Q' + string(n-1-queens[i], '.');
                }
                ans.push_back(board);
                return;
            }
            for(int c = 0; c<n; c++){
                int rc = n-1+r-c;
                if(!col[c] && !diag1[r+c] && !diag2[rc]){
                    queens[r] = c;
                    col[c] = diag1[r+c] = diag2[rc] = true;
                    dfs(r+1);
                    col[c] = diag1[r+c] = diag2[rc] = false;
                }
            } 
        };
        dfs(0);
        return ans;        
    }
};//62
cpp 复制代码
class Solution {
public:
    int searchInsert(vector<int>& nums, int target) {
        int n = nums.size();
        int left = 0, right = n-1, ans = n;
        while(right >= left){
            int mid = left + (right - left)/2;
            if(nums[mid] >= target){
                ans = mid;
                right = mid-1;
            }else{
                left = mid+1;
            }
        } 
        return ans;
    }
};//63
cpp 复制代码
class Solution {
public:
    bool searchMatrix(vector<vector<int>>& matrix, int target) {
        int m = matrix.size(), n = matrix[0].size();
        for(int i = 0; i<m; i++){
            if(matrix[i][0] <= target && target <= matrix[i][n-1]){
                int left = 0, right = n-1;
                while(right >= left){
                    int mid = (right - left)/2 + left;
                    if(matrix[i][mid] > target){
                        right = mid - 1;
                    } else if(matrix[i][mid] < target){
                        left = mid + 1;
                    }else{
                        return true;
                    }
                }
                return false;
            }
        }
        return false;
    }
};//64
cpp 复制代码
class Solution {
public:
    vector<int> searchRange(vector<int>& nums, int target) {
        vector<int> ans(2, -1);
        int left = 0, right = nums.size() - 1;
        while(right >= left){
            int mid = left + (right - left)/2; 
            if(nums[mid] == target){
                int tmp = mid;
                while(mid < nums.size()-1 && nums[mid + 1]==target) mid++;
                ans[1] = mid;
                while(tmp > 0 && nums[tmp-1]==target) tmp--;
                ans[0] = tmp;
                return ans;
            } else if(nums[mid] > target){
                right = mid - 1;
            } else{
                left = mid + 1;
            }
        }
        return ans;  
    }
};//65
cpp 复制代码
class Solution {
public:
    int search(vector<int>& nums, int target) {
        int n = nums.size();
        int l = 0, r = n-1;
        while(l<=r){
            int mid = (l+r)/2;
            if(nums[mid] == target)return mid;
            if(nums[0] <= nums[mid]){
                if(nums[0] <= target && target < nums[mid]) r = mid - 1;
                else l = mid + 1;
            }else{
                if(nums[mid] < target && target <= nums[n-1]) l = mid + 1;
                else r = mid - 1;
            }
        } 
        return -1;
    }
};//66
cpp 复制代码
class Solution {
public:
    int findMin(vector<int>& nums) {
        int l = 0, r = nums.size() - 1;
        while(r > l){
            int mid = l + (r - l) / 2;
            if(nums[mid] < nums[r]){
                r = mid;
            }else{
                l = mid + 1;
            }
        }   
        return nums[r];    
    }
};//67
cpp 复制代码
class Solution {
public:
    double findMedianSortedArrays(vector<int>& nums1, vector<int>& nums2) {
        if(nums1.size() > nums2.size()) swap(nums1, nums2);
        int m = nums1.size(), n = nums2.size();
        nums1.insert(nums1.begin(), INT_MIN);
        nums2.insert(nums2.begin(), INT_MIN);
        nums1.push_back(INT_MAX);
        nums2.push_back(INT_MAX);

        int i = 0, j = (m + n +1) / 2;
        while(true){
            if(nums1[i] <= nums2[j+1] && nums1[i+1] > nums2[j]){
                int max1 = max(nums1[i], nums2[j]);
                int min2 = min(nums1[i+1], nums2[j+1]);
                return (m+n)%2 ? max1 : (min2 + max1) / 2.0;
            }
            i++;
            j--;
        }        
    }
};//68
cpp 复制代码
class Solution {
public:
    bool isValid(string s) {
        unordered_map<char,char> pairs={
            {')', '('},
            {']', '['},
            {'}', '{'}
        };
        stack<char> stk;
        for(char ch : s){
            if(pairs.count(ch)){
                if(stk.empty() || stk.top() != pairs[ch]) return false;
                stk.pop();
            }else{
                stk.push(ch);
            }
        }        
        return stk.empty();
    }
};//69
cpp 复制代码
class MinStack {
public:
    stack<int> x_stack;
    stack<int> min_stack;
    MinStack() {
        min_stack.push(INT_MAX);
    }
    
    void push(int val) {
        x_stack.push(val);
        min_stack.push(min(min_stack.top(), val));        
    }
    
    void pop() {
        x_stack.pop();
        min_stack.pop();
    }
    
    int top() {
        return x_stack.top();
    }
    
    int getMin() {
        return min_stack.top();
    }
};//70
相关推荐
独好紫罗兰18 分钟前
洛谷题单3-P5724 【深基4.习5】求极差 最大跨度值 最大值和最小值的差-python-流程图重构
开发语言·python·算法
朝阳同学24 分钟前
C++中高精度运算问题
开发语言·c++
风清扬雨26 分钟前
计算机视觉中的基于网格的卷绕算法全解析
人工智能·算法·计算机视觉
对方正在长头发丿27 分钟前
棋盘问题(DFS)
数据结构·c++·算法·蓝桥杯·深度优先
@蓝莓果粒茶29 分钟前
LeetCode第132题_分割回文串II
开发语言·算法·leetcode·职场和发展·c#·.net·linq
汐汐咯1 小时前
编程题学习
c++
云闲不收1 小时前
垃圾回收——三色标记法(golang使用)
jvm·算法·golang
孞㐑¥1 小时前
C++之红黑树
开发语言·c++·经验分享·笔记
菜鸟江多多1 小时前
32x32热成像高斯滤波图像处理
图像处理·单片机·算法
阳洞洞1 小时前
二叉树的层序遍历
数据结构·算法·leetcode·二叉树遍历·广度优先搜索