LEETCODE 第 205 場周賽

2022-02-12 21:23:33 字數 4183 閱讀 8974

修改字串中的?字元,使得字串中不存在連續相同的字母

1 <= n <= 100

僅包含小寫字母和?字元

很暴力的題目,貪心選取就結束了

#define sz(x) ((int)x.size())

class solution

string modifystring(string s)

};

給定兩個整數陣列nums1nums2。返回所有滿足規則的三元組:

\(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 != cdp[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;

}};

dp
const 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]表示節點uivi之間存在型別為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...