2024 11月Leetcode Daily
紀錄Leetcode Daily
Leetcode 1957
class Solution {
public:
string makeFancyString(string s) {
string ans = "";
int cnt = 1;
ans.push_back(s[0]);
for(int i=1;i<s.size();i++){
if(s[i] == ans.back()){
cnt++;
if(cnt <= 2){
ans.push_back(s[i]);
}
}else{
ans.push_back(s[i]);
cnt=1;
}
}
return ans;
}
};
Leetcode 2490
class Solution {
public:
bool isCircularSentence(string sentence) {
int n = sentence.size()-1;
if(sentence[0] != sentence[n]) return false;
for(int i=0;i<=n;i++){
if(sentence[i] == ' '){
if(sentence[i-1] != sentence[i+1])return false;
}
}
return true;
}
};
Leetcode 796
class Solution {
public:
bool rotateString(string s, string goal) {
int i = 0;
int n = s.size();
while(i < n){
if(s == goal) return true;
char c = s[0];
s.erase(s.begin());
s.push_back(c);
i++;
}
return false;
}
};
Leetcode 3163
class Solution {
public:
string compressedString(string word) {
string ans = "";
int i = 1;
int cnt = 1;
char w = word[0];
while(i <= word.size()){
if(w == word[i]){
cnt++;
if(cnt > 9){
cnt -= 9;
ans.push_back(9+'0');
ans.push_back(word[i-1]);
}
}else{
ans.push_back(cnt+'0');
ans.push_back(word[i-1]);
cnt = 1;
w = word[i];
}
i++;
}
return ans;
}
};
Leetcode 2914
class Solution {
public:
int minChanges(string s) {
int k = 0;
for(int i=0;i<s.size()-1;i+=2){
if(s[i]!= s[i+1])k++;
}
return k;
}
};
Leetcode 3011
class Solution {
public:
int setBits(int num){
int count = 0;
for(int i=31;i>=0;i--){
if((num >> i) & 1){
count++;
}
}
return count;
}
bool check(vector<int> &nums){
for(int i=1;i<nums.size();i++)
if(nums[i] < nums[i-1])
return false;
return true;
}
bool canSortArray(vector<int>& nums) {
vector<int> count(nums.size(),0);
for(int i=0;i<nums.size();i++) count[i] = setBits(nums[i]);
int k = 0;
while(k < nums.size()){
for(int i=1;i<nums.size();i++)
if(count[i] == count[i-1] && nums[i]<nums[i-1])
swap(nums[i],nums[i-1]);
if(check(nums)) return true;
k++;
}
return false;
}
};
Leetcode 2275
class Solution {
public:
int largestCombination(vector<int>& candidates) {
// 最多1下來絕對大於0,找最多的1的就行
int maxCnt = 0;
// 24是10^7
for(int i=0;i<24;i++){
int cnt = 0;
for(int n : candidates){
if(n & (1 << i)) cnt++;
}
maxCnt = max(maxCnt,cnt);
}
return maxCnt;
}
};
Leetcode 1829
class Solution {
public:
vector<int> getMaximumXor(vector<int>& nums, int maximumBit) {
if(nums.size() == 1) return {(1 << maximumBit)-1} ;
int n = nums.size();
int maxBit = (1 << maximumBit)-1;
int xorNum = 0;
vector<int> result(n);
for(int num : nums) xorNum ^= num;
for(int i =0;i<n;i++){
result[i] = xorNum ^ maxBit;
xorNum ^= nums[n-1-i];
}
return result;
}
};
Leetcode 3133
class Solution {
public:
long long minEnd(int n, int x) {
long long ans = x;
long long remaining = n-1;
long long mask = 1;
while(remaining){
if(!(x&mask)){
ans |= (remaining&1)*mask;
remaining >>=1;
}
mask <<= 1;
}
return ans;
}
};
Leetcode 3097
class Solution {
public:
int minimumSubarrayLength(vector<int>& nums, int k) {
int minDist = 0x3f3f3f;
int num = 0 ;
int l = 0;
int r = nums.size();
while(l < r){
int mid = l + (r-l)/2;
if(check(nums,mid,k)) r=mid;
else l = mid+1;
}
if(!check(nums,l,k)) return -1;
return l;
}
bool check(vector<int>&nums,int len,int k){
vector<int> cnt(31);
for(int i=0;i<len-1;i++){
for(int j=0;j<31;j++)
cnt[j] += ((nums[i]>>j)&1);
}
for(int i=len-1;i<nums.size();i++){
for(int j=0;j<31;j++)
cnt[j] += ((nums[i]>>j)&1);
int sum = 0;
for(int j=0;j<31;j++)
if(cnt[j] > 0) sum += (1<<j);
if(sum >= k) return true;
for(int j=0;j<31;j++)
cnt[j] -= ((nums[i-len+1]>>j)&1);
}
return false;
}
};
Leetcode 2601
class Solution {
public:
vector<int> prim;
bool is_prim[1001];
void pr(){
is_prim[0] = is_prim[1] = false;
for(int i=2;i<1001;i++) is_prim[i] = true;
for(int i=2;i<1001;i++) {
if(is_prim[i]){
prim.push_back(i);
if(i*i>1001) continue;
for(int j=i*i;j<1001;j+=i){
is_prim[j] = false;
}
}
}
}
bool primeSubOperation(vector<int>& nums) {
pr();
int n = nums.size();
for(int i=n-2;i>=0;i--){
if(nums[i+1] > nums[i]) continue;
int num = nums[i] - nums[i+1];
auto it = upper_bound(prim.begin(),prim.end(),num);
if(it == prim.end() || *it >= nums[i]) return false;
nums[i] -= *it;
}
return true;
}
};
Leetcode 2070
class Solution {
public:
vector<int> maximumBeauty(vector<vector<int>>& items, vector<int>& queries) {
sort(items.begin(),items.end());
for(int i=1;i<items.size();i++){
items[i][1] = max(items[i-1][1],items[i][1]);
}
map<int,int> mp;
for(auto i : items){
mp[i[0]] = i[1];
}
vector<int> result;
for(auto q : queries) {
auto it = mp.upper_bound(q);
if(it == mp.begin()) result.push_back(0);
else result.push_back(prev(it)->second);
}
return result;
}
};
Leetcode 2563
class Solution {
public:
int bslower(vector<int>&nums,int lower,int num,int l,int r){
int pos = nums.size();
while(l <= r){
int mid = l+(r-l)/2;
if(nums[mid]+num >= lower){
pos = mid;
r = mid-1;
}else{
l = mid+1;
}
}
return pos;
}
int bsupper(vector<int>&nums,int upper,int num,int l,int r){
int pos = nums.size();
while(l <= r){
int mid = l+(r-l)/2;
if(nums[mid]+num <= upper){
pos = mid;
l = mid+1;
}else{
r = mid-1;
}
}
return pos;
}
long long countFairPairs(vector<int>& nums, int lower, int upper) {
sort(nums.begin(),nums.end());
int n = nums.size();
long long ans = 0;
for(int i=0;i<n;i++){
int l = bslower(nums,lower,nums[i],i+1,n-1);
int r = bsupper(nums,upper,nums[i],i+1,n-1);
if(l != n && r != n ) ans += (r-l+1);
}
return ans;
}
};
Leetcode 2064
class Solution {
public:
bool check(int mid,vector<int>& qu,int n){
int sum = 0;
for(auto q : qu)
sum += (mid+q-1)/mid;
return sum > n;
}
int minimizedMaximum(int n, vector<int>& quantities) {
if(quantities.size() == 1) return quantities[0];
int l = 1;
int r = 0;
for(auto q : quantities) r = max(r,q);
while(l < r){
int mid = l+(r-l)/2;
if(check(mid,quantities,n)){
l = mid+1;
}else{
r = mid;
}
}
return l;
}
};
Leetcode 1574
class Solution {
public:
int findLengthOfShortestSubarray(vector<int>& arr) {
int l = 0;
int n = arr.size();
int r = n-1;
while(l+1 < arr.size() && arr[l] <= arr[l+1]) l++;
if(l == arr.size()-1) return 0;
while(r >l && arr[r] >= arr[r-1]) r--;
int ans = min(r,n-l-1);
int i =0;
int j =r;
while (i <= l && j < n )
if(arr[i] <= arr[j]){
ans = min(ans,j-i-1);
++i;
}else{
++j;
}
return ans;
}
};
Leetcode 3254
class Solution {
public:
vector<int> resultsArray(vector<int>& nums, int k) {
if(k == 1) return nums;
int n = nums.size();
vector<int>dp(n,1);
vector<int>ans(n-k+1,-1);
for(int i=1;i<n;i++){
if(nums[i-1]+1 == nums[i]){
dp[i] = 1+dp[i-1];
}
}
for(int i=k-1,j=0; i<nums.size();i++,j++){
if(dp[i] >= k){
ans[j]=nums[i];
}
}
return ans;
}
};
Leetcode 862
class Solution {
public:
int shortestSubarray(vector<int>& nums, int k) {
if(nums.size() == 1){
if(nums[0] >= k) return nums[0];
}
int res = INT_MAX;
long long sum = 0;
deque<pair<long long,int>> dq;
for(int i =0;i<nums.size();i++){
sum += nums[i];
if(sum >= k) res = min(res,i+1);
while(!dq.empty() && sum - dq.front().first >=k){
auto [prefix,idx] = dq.front();
dq.pop_front();
res = min(res,i-idx);
}
while(!dq.empty() && dq.back().first > sum) dq.pop_back();
dq.push_back({sum,i});
}
return res == INT_MAX ? -1 : res;
}
};
Leetcode 1652
class Solution {
public:
vector<int> decrypt(vector<int>& code, int k) {
int n = code.size();
vector<int> ans(n,0);
if(k == 0) return ans;
for(int i=0;i<n;i++){
int sum = 0;
if(k > 0){
for(int j=1;j<= k;j++){
sum += code[(i+j)%n];
}
}else if(k <0){
for(int j=1;j<=-k;j++){
sum += code[(i-j+n)%n];
}
}
ans[i] = sum;
}
return ans;
}
};
Leetcode 2461
class Solution {
public:
long long maximumSubarraySum(vector<int>& nums, int k) {
unordered_map<int, int> count;
long long currentSum = 0, maxSum = 0;
int left = 0;
for (int right = 0; right < nums.size(); ++right) {
count[nums[right]]++;
currentSum += nums[right];
while (count[nums[right]] > 1 || (right - left + 1 > k)) {
currentSum -= nums[left];
count[nums[left]]--;
if (count[nums[left]] == 0) {
count.erase(nums[left]);
}
left++;
}
if (right - left + 1 == k) {
maxSum = max(maxSum, currentSum);
}
}
return maxSum;
}
};
Leetcode 2516
#include <unordered_map>
#include <vector>
class Solution {
public:
int takeCharacters(string s, int k) {
int n = s.size();
int r[3];
for(auto c : s) r[c-'a']++;
if(r[0] < k || r[1] <k || r[2] < k) return -1;
int freq[3];
int l = 0;
for(int i=0;i<n;i++){
freq[s[i]-'a']++;
while(r[s[l]-'a']-freq[s[i]-'a'] >k && l < 3){
freq[s[l]-'a']--;
l++;
}
}
return l;
}
};
Leetcode 2257
#include <ios>
#include <iostream>
#include <queue>
#include <variant>
#include <vector>
using namespace std;
class Solution {
public:
int countUnguarded(int m, int n, vector<vector<int>>& guards, vector<vector<int>>& walls) {
ios::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
int grid[m][n];
memset(grid,0,sizeof(grid));
for(auto g : guards)grid[g[0]][g[1]]=2;
for(auto w : walls)grid[w[0]][w[1]] = 2;
vector<pair<int,int>>dict = {
{-1,0},
{0,1},
{1,0},
{0,-1}
};
for(auto g : guards){
for(auto d : dict){
int x = g[0];
int y = g[1];
while(x + d.first < m && y + d.second < n && x + d.first>= 0 && y+d.second >=0 && grid[x+d.first][y+d.second] < 2 ){
x += d.first;
y += d.second;
grid[x][y] = 1;
}
}
}
int ans = 0 ;
for(int i=0;i<m;i++) ans += count(grid[i],grid[i]+n,0);
return ans;
}
};
Leetcode 1072
#include <unordered_map>
using namespace std;
class Solution {
public:
int maxEqualRowsAfterFlips(vector<vector<int>>& matrix) {
int m = matrix[0].size();
int ans = 0;
unordered_map<string, int> cnt;
for(auto row : matrix){
string r(m,0);
for(int j=0;j<m;j++)
r[j] = row[j] ^ row[0];
cnt[r]++;
ans = max(ans,cnt[r]);
}
return ans;
}
};
Leetcode 1861
#include <deque>
class Solution {
public:
vector<vector<char>> rotateTheBox(vector<vector<char>> &box) {
int n = box.size();
int m = box[0].size();
for (int i = 0; i < n; i++) {
std::deque<int> dq;
for (int j = m - 1; j >= 0; j--) {
if (box[i][j] == '*') {
dq.clear();
} else if (box[i][j] == '#') {
if (!dq.empty()) {
int t = dq.front();
dq.pop_front();
box[i][t] = '#';
box[i][j] = '.';
dq.push_back(j);
}
} else {
dq.push_back(j);
}
}
}
vector<vector<char>> ans(m, vector<char>(n, 0));
for (int i = 0; i < n; i++) {
for (int j = 0; j < m; j++) {
ans[j][n - i - 1] = box[i][j];
}
}
return ans;
}
};
Leetcode 1975
#include <algorithm>
#include <climits>
#include <cstdlib>
class Solution {
public:
long long maxMatrixSum(vector<vector<int>> &matrix) {
long long sum = 0;
int nagative_nums = 0;
int min_num = INT_MAX;
for (auto row : matrix) {
for (auto x : row) {
min_num = std::min(min_num, abs(x));
if (x < 0)
nagative_nums++;
sum += abs(x);
}
}
return nagative_nums % 2 == 0 ? sum : sum -= 2 * (min_num);
}
};
Leetcode 773
#include <queue>
#include <tuple>
#include <unordered_set>
#include <vector>
using namespace std;
class Solution {
public:
int slidingPuzzle(vector<vector<int>> &board) {
vector<vector<int>> pos = {
{1, 3}, // 0
{0, 2, 4}, // 1
{1, 5}, // 2
{0, 4}, // 3
{1, 3, 5}, // 4
{2, 4} // 5
};
string target = "123450";
string start = "";
for (auto c : board)
for (auto r : c)
start += (r + '0');
if (start == target)
return 0;
queue<string> q;
unordered_set<string> visitis;
q.push(start);
int step = 0;
while (!q.empty()) {
for (int i = q.size(); i > 0; i--) {
string front = q.front();
q.pop();
if (front == target)
return step;
else if (visitis.count(front))
continue;
visitis.insert(front);
int idx = front.find('0');
for (auto &n : pos[idx]) {
string next_ = front;
swap(next_[n], next_[idx]);
q.push(next_);
}
}
step++;
}
return -1;
}
};
Leetcode 2924
class Solution {
public:
int findChampion(int n, vector<vector<int>> &edges) {
vector<int> edg(n, 0);
for (auto e : edges) {
int w = e[1];
edg[w]++;
}
vector<int> edg_;
for(int i=0;i<edg.size();i++){
if(edg[i] == 0) edg_.push_back(i);
}
return edg_.size() != 1 ? -1 : edg_[0];
}
};
Leetcode 3243
#include <numeric>
#include <queue>
using namespace std;
class Solution {
public:
vector<int> shortestDistanceAfterQueries(int n,
vector<vector<int>> &queries) {
vector<int> dis(n);
iota(dis.begin(), dis.end(), 0);
vector<vector<int>> grid(n);
for (int i = 0; i < n-1; i++) {
grid[i].push_back(i + 1);
}
vector<int> ans;
for (auto q : queries) {
int source = q[0];
int des = q[1];
grid[source].push_back(des);
if (dis[source] + 1 < dis[des]) {
queue<int> q;
q.push(des);
dis[des] = dis[source] + 1;
while (!q.empty()) {
int d = q.front();
q.pop();
for (auto g : grid[d]) {
if (dis[d] + 1 < dis[g]) {
dis[g] = dis[d]+1;
q.push(g);
}
}
}
}
ans.push_back(dis.back());
}
return ans;
}
};
Leetcode 2290
Solution 1
#include <climits>
#include <deque>
#include <utility>
#include <vector>
using namespace std;
class Solution {
public:
int minimumObstacles(vector<vector<int>> &grid) {
int r = grid.size();
int c = grid[0].size();
deque<pair<int, int>> dq{{0, 0}};
vector<vector<int>> dist(r, vector<int>(c, INT_MAX));
dist[0][0] = 0;
vector<int> dx = {1, -1, 0, 0};
vector<int> dy = {0, 0, 1, -1};
while (!dq.empty()) {
auto [x, y] = dq.front();
dq.pop_front();
for (int i = 0; i < 4; i++) {
int nx = x + dx[i];
int ny = y + dy[i];
if (nx >= 0 && nx < r && ny >= 0 && ny < c) {
int d = dist[x][y] + grid[nx][ny];
if (d < dist[nx][ny]) {
dist[nx][ny] = d;
grid[nx][ny] == 0 ? dq.push_front({nx, ny})
: dq.push_back({nx, ny});
}
}
}
}
return dist[r - 1][c - 1];
}
};
Solution 2
#define pint pair<int,int>
class Solution {
public:
int minimumObstacles(vector<vector<int>>& grid) {
int r = grid.size();
int c = grid[0].size();
vector<vector<int>>dist(r,vector<int>(c,INT_MAX));
priority_queue<pair<int,pint>,vector<pair<int,pint>>,greater<pair<int,pint>>> minHeap;
minHeap.push({0,{0,0}});
vector<pair<int,int>> dir {{0,1},{1,0},{0,-1},{-1,0}};
dist[0][0] = 0;
while(!minHeap.empty()){
auto [minDist,idx] = minHeap.top();
auto [x,y] = idx;
minHeap.pop();
for(auto [dx,dy] : dir){
int nx = x + dx;
int ny = y + dy;
if(nx >=0 && nx < r && ny >= 0 && ny < c){
int newDist = minDist + grid[nx][ny];
if(newDist < dist[nx][ny]){
dist[nx][ny] = newDist;
minHeap.push({newDist,{nx,ny}});
}
}
}
}
return dist[r-1][c-1];
}
};
Leetcode 2577
#include <functional>
#include <queue>
#include <tuple>
#include <vector>
using namespace std;
class Solution {
public:
int minimumTime(vector<vector<int>> &grid) {
if (grid[0][1] > 1 && grid[1][0] > 1)
return -1;
int n = grid.size();
int m = grid[0].size();
int distence[n][m];
memset(distence,0x3f,sizeof(distence));
distence[0][0] = 0;
priority_queue<tuple<int, int, int>, vector<tuple<int, int, int>>,
greater<>>
pq;
pq.push({0, 0, 0});
vector<pair<int, int>> dict = {{1, 0}, {-1, 0}, {0, 1}, {0, -1}};
for (;;) {
auto [d, i, j] = pq.top();
pq.pop();
if(d > distence[i][j]) continue;
if (i == n - 1 && j == m - 1)
return d;
for (auto &q : dict) {
int x = i + q.first;
int y = j + q.second;
if (x >= 0 && x < n && y >= 0 && y < m) {
int nd = max(d + 1, grid[x][y]);
nd += (nd - x - y) % 2;
if (nd < distence[x][y]) {
distence[x][y] = nd;
pq.push({nd, x, y});
}
}
}
}
}
};
Leetcode 2097
#include <algorithm>
#include <map>
#include <vector>
using namespace std;
class Solution {
public:
map<int, vector<int>> mp;
map<int, int> deg;
vector<vector<int>> ans;
void dfs(int n) {
vector<int> &e = mp[n];
while (!e.empty()) {
int back = e.back();
e.pop_back();
dfs(back);
ans.push_back({n, back});
}
}
vector<vector<int>> validArrangement(vector<vector<int>> &pairs) {
for (auto pair : pairs) {
mp[pair[0]].push_back(pair[1]);
deg[pair[0]]--;
deg[pair[1]]++;
}
for (auto it = deg.begin(); it != deg.end(); it++)
if (it->second == -1)
dfs(it->first);
if (ans.empty())
dfs(deg.begin()->first);
reverse(ans.begin(), ans.end());
return ans;
}
};