文章链接 | 题目链接 | 视频链接
暴力解法
class Solution {
public:
bool monotone(int num){
int max = 10;
while (num) {
int t = num % 10;
if (max >= t) max = t;
else return false;
num = num / 10;
}
return true;
}
int monotoneIncreasingDigits(int n) {
for (int i = n; i > 0; i--){
if (monotone(i)){
return i;
}
}
return 0;
}
};
贪心算法
class Solution {
public:
int monotoneIncreasingDigits(int n) {
string strNum = to_string(n);
int flag = strNum.size();
for (int i = strNum.size()-1; i > 0; i--){
if (strNum[i] < strNum[i-1]){
flag = i;
strNum[i-1]--;
}
}
for (int i = flag; i < strNum.size(); i++){
strNum[i] = '9';
}
return stoi(strNum);
}
};
class Solution:
def monotoneIncreasingDigits(self, n: int) -> int:
strNum = list(str(n))
for i in range(len(strNum) - 1, 0, -1):
if strNum[i - 1] > strNum[i]:
strNum[i - 1] = str(int(strNum[i - 1]) - 1)
for j in range(i, len(strNum)):
strNum[j] = '9'
return int(''.join(strNum))
文章链接 | 题目链接 | 视频链接
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode() : val(0), left(nullptr), right(nullptr) {}
* TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
* TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
* };
*/
class Solution {
public:
int result;
int traverse(TreeNode* curr){
if (curr == nullptr){
return 2;
}
int left = traverse(curr->left);
int right = traverse(curr->right);
if (left == 2 && right == 2){
return 0;
} else if (left == 0 || right == 0){
result++;
return 1;
} else {
return 2;
}
}
int minCameraCover(TreeNode* root) {
result = 0;
if (traverse(root) == 0){
result++;
}
return result;
}
};
# Definition for a binary tree node.
# class TreeNode:
# def __init__(self, val=0, left=None, right=None):
# self.val = val
# self.left = left
# self.right = right
class Solution:
def traverse(self, result: List[int], root: Optional[TreeNode]) -> int:
if root is None:
return 2
left = self.traverse(result, root.left)
right = self.traverse(result, root.right)
if left == 2 and right == 2:
return 0
elif left == 0 or right == 0:
result[0] += 1
return 1
else:
return 2
def minCameraCover(self, root: Optional[TreeNode]) -> int:
result = [0]
if self.traverse(result, root) == 0:
result[0] += 1
return result[0]
文章链接
class Solution {
public:
int fourSumCount(vector& nums1, vector& nums2, vector& nums3, vector& nums4) {
unordered_map umap;
int result = 0;
for (int a : nums1){
for (int b : nums2){
umap[a+b]++;
}
}
for (int c : nums3){
for (int d : nums4){
if (umap.find(0 - (c+d)) != umap.end()){
result += umap[0 - (c+d)];
}
}
}
return result;
}
};
class Solution {
public:
bool canConstruct(string ransomNote, string magazine) {
unordered_map umap;
for (char letter : magazine){
umap[letter]++;
}
for (char letter : ransomNote){
if (umap[letter] > 0){
umap[letter]--;
} else {
return false;
}
}
return true;
}
};
class Solution {
public:
vector> threeSum(vector& nums) {
vector> result;
sort(nums.begin(), nums.end());
for (int i = 0; i < nums.size(); i++){
if (nums[i] > 0){
return result;
}
if (i > 0 && nums[i] == nums[i-1]){
continue;
}
int left = i+1;
int right = nums.size() - 1;
while (right > left){
if (nums[i] + nums[left] + nums[right] > 0) right--;
else if (nums[i] + nums[left] + nums[right] < 0) left++;
else {
result.push_back(vector{nums[i], nums[left], nums[right]});
while (right > left && nums[right] == nums[right-1]){
right--;
}
while (right > left && nums[left] == nums[left+1]){
left++;
}
right--;
left++;
}
}
}
return result;
}
};
class Solution {
public:
vector> fourSum(vector& nums, int target) {
vector> result;
sort(nums.begin(), nums.end());
for (int i = 0; i < nums.size(); i++){
if (nums[i] > target && nums[i] >= 0){
break;
}
if (i > 0 && nums[i] == nums[i-1]){
continue;
}
for (int j = i + 1; j < nums.size(); j++){
if (nums[i] + nums[j] > target && nums[i] + nums[j] >= 0) {
break;
}
if (j > i + 1 && nums[j] == nums[j-1]){
continue;
}
int left = j + 1;
int right = nums.size() - 1;
while (right > left){
long fourSum = (long) nums[i] + nums[j] + nums[left] + nums[right];
if (fourSum == target){
result.push_back(vector{nums[i], nums[j], nums[left], nums[right]});
while (right > left && nums[left] == nums[left+1]){
left++;
}
while (right > left && nums[right] == nums[right-1]){
right--;
}
left++;
right--;
}
else if (fourSum > target){
right--;
} else {
left++;
}
}
}
}
return result;
}