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