力扣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
相关推荐
liulun9 分钟前
Skia如何绘制几何图形
c++·windows
old_power15 分钟前
UCRT 和 MSVC 的区别(Windows 平台上 C/C++ 开发相关)
c语言·c++·windows
东皇太星24 分钟前
SIFT算法详细原理与应用
图像处理·算法·计算机视觉
獨枭31 分钟前
彻底解决 MFC 自绘控件闪烁
c++·mfc
獨枭32 分钟前
MFC Resource.h 文件详解与修改指南
c++·mfc
鑫鑫向栄35 分钟前
[蓝桥杯]堆的计数
数据结构·c++·算法·蓝桥杯·动态规划
緈福的街口1 小时前
【leetcode】3. 无重复字符的最长子串
算法·leetcode·职场和发展
温宇飞1 小时前
C++ 匿名命名空间 vs static
c++
麦仓分享1 小时前
C++算法动态规划3
算法·动态规划
温宇飞1 小时前
C++ 泛型编程
c++