修改字串中的很暴力的題目,貪心選取就結束了?
字元,使得字串中不存在連續相同的字母
1 <= n <= 100
僅包含小寫字母和
?
字元
#define sz(x) ((int)x.size())
class solution
string modifystring(string s)
};
給定兩個整數陣列其實類似於兩數之和,無非是nums1
和nums2
。返回所有滿足規則的三元組:\(nums[i] ^2 = nums[j] \times nums[k] \quad i \in [0, nums1.length],\quad j,k \in [0, nums2.length] \quad j \neq k\)
\(nums[i] ^2 = nums[j] \times nums[k] \quad i \in [0, nums2.length],\quad j,k \in [0, nums1.length] \quad j \neq k\)
雙指標
或者利用hashmap
(由於n
的數量級為1e3
, 所以直接暴力顯然是不合適的)
那麼思路就比較簡單了,還有乙個坑點在於陣列中最大的數字為1e5
,平方之後無法用int
表示,所以需要開long long
。
對於雙指標寫法,需要考慮如何處理重複元素,實際上是乙個簡單的組合數學知識,分為兩種情況:
而利用hashmap
的方法則簡單許多,不再贅述。
#define sort(x) sort(x.begin(), x.end())
#define sz(x) ((int)x.size())
using vi = vector;
using ll = long long;
class solution
int tl = l + 1, tr = r - 1;
while (tl < r && nums2[tl] == nums2[l]) ++ tl;
while (tr > l && nums2[tr] == nums2[r]) -- tr;
ans += (tl - l) * (r - tr);
l = tl - 1, r = tr + 1;
++ l;
}else if (cur < sq) ++ l;
else -- r; }}
return ans;
}int numtriplets(vector& nums1, vector& nums2)
};
#define sort(x) sort(x.begin(), x.end())
#define sz(x) ((int)x.size())
using vi = vector;
using ll = long long;
class solution
}for (int i = 0; i + 1 < sz(nums2); ++ i)
}return ans;
}};
給你乙個字串首先,不難想到使用s
和乙個整數陣列cost
,其中cost[i]
是從s
中刪除字元i
的代價。返回使字串任意相鄰兩個字母不相同的最小刪除成本。
請注意,刪除乙個字元後,刪除其他字元的成本不會改變。
dp
去解決,重點在於dp
陣列如何表示。 這題我們可以順序 dp ,重點在於考慮最後乙個字元,因此 dp 陣列可以表示為:
dp[i][j] := 字串前 i 個字元,且結尾字元為 j 且滿足任意相鄰字元不同的最小刪除開銷
則轉移有兩種方式,第一種是不刪當前字元,第二種是刪除當前字元。設當前位置為i
,當前字元為c
。
對於第一種轉移,列舉dp[i - 1][k]
且k != c
,dp[i][c] = min(dp[i][c], dp[i - 1][k])
對於第二種轉移,列舉dp[i - 1][k]
,dp[i][k] = min(dp[i][k], dp[i - 1][k])
當然,存在乙個更簡單的方法,尋找每一段重複區間,保留其中刪除代價最大的字元,用滑動視窗解決。
滑動視窗
#define chmax(a, b) a = max(a, b);
const int rinf = 0xc0c0c0c0;
class solution
idx = sc;
ans += (tot - mx);
}return ans;
}};
dpconst int maxn = 1e5 + 50;
int dp[maxn][30];
class solution
for (int k = 0; k < 26; k++)
}int ans = -1;
for (int k = 0; k < 26; k++)
return ans;
}};
alice 和 bob 共有乙個無向圖,其中包含 n 個節點和 3 種型別的邊:首先,這個題目顯然是乙個圖論題。要求每條路徑都可以完全遍歷,顯然是生成樹有關演算法。如何保證保留的邊最小呢?考慮貪心法。給你乙個陣列
edges
,其中edges[i] = [typei, ui, vi]
表示節點ui
和vi
之間存在型別為typei
的雙向邊。請你在保證圖仍能夠被 alice和 bob 完全遍歷的前提下,找出可以刪除的最大邊數。如果從任何節點開始,alice 和 bob 都可以到達所有其他節點,則認為圖是可以完全遍歷的。返回可以刪除的最大邊數,如果 alice 和 bob 無法完全遍歷圖,則返回 -1 。
首先,公用邊盡量保留。我們可以先利用公用邊進行dsu的合併。隨後,分別對於alice
,bob
再執行生成樹演算法。保證每個人都可以遍歷那麼答案就非常簡單了。
namespace dsu1
int find(int x)
void to_union(int x, int y)
}bool is_same(int x, int y)
};namespace dsu2
int find(int x)
void to_union(int x, int y)
}bool is_same(int x, int y)
};namespace dsu3
int find(int x)
void to_union(int x, int y)
}bool is_same(int x, int y)
};const int maxn = 1e5 + 50;
class solution
}if (t == 2 || t == 3)
}if (t == 3)else ++ need;}}
if (cnt1 != 1 || cnt2 != 1) return -1;
return sz(edges) - (allu - need + 2 * (cnt3 - 1));
}};
leetcode 第205場周賽
1576.替換所有的問號 難度 打卡 考點 遍歷 時間複雜度 o n class solution char chs new char 110 int n s.length chs 0 0 for int i 1 i n i chs n 1 0 for int i 1 i n i chs i cha...
leetcode 第132場周賽
愛麗絲和鮑勃一起玩遊戲,他們輪流行動。愛麗絲先手開局。最初,黑板上有乙個數字n。在每個玩家的回合,玩家需要執行以下操作 如果玩家無法執行這些操作,就會輸掉遊戲。只有在愛麗絲在遊戲中取得勝利時才返回true,否則返回false。假設兩個玩家都以最佳狀態參與遊戲。示例 1 輸入 2輸出 true解釋 愛...
leetcode周賽 第176場
題目描述 給你乙個 m n 的矩陣 grid,矩陣中的元素無論是按行還是按列,都以非遞增順序排列。請你統計並返回 grid 中 負數 的數目。示例 1 輸入 grid 4,3,2,1 3,2,1,1 1,1,1,2 1,1,2,3 輸出 8 解釋 矩陣中共有 8 個負數。示例 2 輸入 grid 3...