持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第22天,点击查看活动详情
74. 搜索二维矩阵
思路:
代码:
class Solution {
public:
bool searchMatrix(vector<vector<int>>& mat, int t) {
int m = mat.size(), n = mat[0].size();
// 第一次二分:定位到所在行(从上往下,找到最后一个满足 mat[x]][0] <= t 的行号)
int l = 0, r = m - 1;
while (l < r) {
int mid = (l + r + 1 )>> 1;
if (mat[mid][0] <= t) {
l = mid;
} else {
r = mid - 1;
}
}
int row = r;
if (mat[row][0] == t) return true;
if (mat[row][0] > t) return false;
// 第二次二分:从所在行中定位到列(从左到右,找到最后一个满足 mat[row][x] <= t 的列号)
l = 0; r = n - 1;
while (l < r) {
int mid = (l + r + 1 )>> 1;
if (mat[row][mid] <= t) {
l = mid;
} else {
r = mid - 1;
}
}
int col = r;
return mat[row][col] == t;
}
};
208. 实现 Trie (前缀树)
思路:
代码:
class Trie {
private:
bool isEnd;
Trie*next[26];
public:
Trie() {
isEnd = false;
memset(next, 0, sizeof(next));
}
void insert(string word) {
Trie*node = this;
for (char c : word) {
if (node->next[c-'a'] == NULL) {
node->next[c-'a'] = new Trie();
}
node = node->next[c-'a'];
}
node->isEnd = true;
}
bool search(string word) {
Trie*node = this;
for (char c : word) {
node = node->next[c-'a'];
if (node == NULL) {
return false;
}
}
return node->isEnd;
}
bool startsWith(string prefix) {
Trie*node = this;
for (char c : prefix) {
node = node->next[c-'a'];
if (node == NULL) {
return false;
}
}return true;
}
};
/**
* Your Trie object will be instantiated and called as such:
* Trie* obj = new Trie();
* obj->insert(word);
* bool param_2 = obj->search(word);
* bool param_3 = obj->startsWith(prefix);
*/
518. 零钱兑换 II
思路:
代码:
class Solution {
public:
int change(int amount, vector<int>& coins) {
vector<int> dp(amount + 1, 0);
dp[0] = 1;
for (int i = 0; i < coins.size(); i++) {
for (int j = coins[i]; j <= amount; j++) {
dp[j] += dp[j - coins[i]];
}
}return dp[amount];
}
};
剑指 Offer II 102. 加减的目标值
思路:
代码:
class Solution {
public:
int findTargetSumWays(vector<int>& nums, int s) {
int sum = 0;
for (int i = 0; i < nums.size(); i++) {
sum += nums[i];
}
if (abs(s) > sum) return 0;
if ((s + sum) % 2 == 1) return 0;
int bagSize = (s + sum) / 2;
vector<int> dp(bagSize + 1, 0);
dp[0] = 1;
for (int i = 0; i <nums.size(); i++) {
for (int j = bagSize; j >= nums[i]; j--) {
dp[j] += dp[j - nums[i]];
}
}return dp[bagSize];
}
};