题目1
给你两个有序整数数组 nums1 和 nums2,请你将 nums2 合并到 nums1 中,使 nums1 成为一个有序数组。
说明:
- 初始化 nums1 和 nums2 的元素数量分别为 m 和 n 。
- 你可以假设 nums1 有足够的空间(空间大小大于或等于 m + n)来保存 nums2 中的元素。
示例:
输入: nums1 = [1,2,3,0,0,0], m = 3 nums2 = [2,5,6], n = 3 输出: [1,2,2,3,5,6]
思路及代码
很巧妙的办法,倒插,这样就可以避免顺插的时候每插入一次都要每一位后移。
class Solution {
public:
void merge(vector<int>& nums1, int m, vector<int>& nums2, int n) {
int pos1 = m-1;
int pos2 = n-1;
int len = m + n - 1;
while(pos1 >= 0 && pos2 >= 0){
if(nums1[pos1] >= nums2[pos2]){
nums1[len--] = nums1[pos1--];
}else{
nums1[len--] = nums2[pos2--];
}
}
while(pos2 >= 0) {
nums1[len--] = nums2[pos2--];
}
}
};
题目2
给定一个由整数数组 A
表示的环形数组 C
,求 C
的非空子数组的最大可能和。
在此处,环形数组意味着数组的末端将会与开头相连呈环状。(形式上,当0 <= i < A.length
时 C[i] = A[i]
,而当 i >= 0
时 C[i+A.length] = C[i]
)
此外,子数组最多只能包含固定缓冲区 A
中的每个元素一次。(形式上,对于子数组 C[i], C[i+1], ..., C[j]
,不存在 i <= k1, k2 <= j
其中 k1 % A.length = k2 % A.length
)
示例 1:
输入:[1,-2,3,-2] 输出:3 解释:从子数组 [3] 得到最大和 3
示例 2:
输入:[5,-3,5] 输出:10 解释:从子数组 [5,5] 得到最大和 5 + 5 = 10
示例 3:
输入:[3,-1,2,-1] 输出:4 解释:从子数组 [2,-1,3] 得到最大和 2 + (-1) + 3 = 4
示例 4:
输入:[3,-2,2,-3] 输出:3 解释:从子数组 [3] 和 [3,-2,2] 都可以得到最大和 3
示例 5:
输入:[-2,-3,-1] 输出:-1 解释:从子数组 [-1] 得到最大和 -1
提示:
-30000 <= A[i] <= 30000
1 <= A.length <= 30000
思路及代码
这道题是重点,采用了一个算法Kadane
算法,刚看到题目的时候直接想到的就是DP,这里的Kadane算法就是DP的一种进一步优化,适合求这一类问题——最大子序列。
附一篇文章https://blog.csdn.net/lengxiao1993/article/details/52303492
class Solution {
public:
int maxSubarraySumCircular(vector<int>& A) {
int sum = 0;
int maxSum = INT_MIN, curMax = 0, minSum = INT_MAX, curMin = 0;
for(int i = 0;i < A.size();i++){
curMax = max(curMax + A[i],A[i]);
maxSum = max(maxSum,curMax);
curMin = min(curMin + A[i],A[i]);
minSum = min(minSum,curMin);
sum += A[i];
}
if(maxSum > 0)
return max(maxSum, sum - minSum);
else
return maxSum;
}
};
题目3
给你一棵二叉树,请你返回满足以下条件的所有节点的值之和:
- 该节点的祖父节点的值为偶数。(一个节点的祖父节点是指该节点的父节点的父节点。)
如果不存在祖父节点值为偶数的节点,那么返回 0
。
示例:
输入:root = [6,7,8,2,7,1,3,9,null,1,4,null,null,null,5] 输出:18 解释:图中红色节点的祖父节点的值为偶数,蓝色节点为这些红色节点的祖父节点。
提示:
- 树中节点的数目在
1
到10^4
之间。 - 每个节点的值在
1
到100
之间。
思路及代码
递归去找一下就行了。注意退出条件和判断条件即可。
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode(int x) : val(x), left(NULL), right(NULL) {}
* };
*/
class Solution {
public:
int compute(TreeNode* root){
if(root == NULL || (root->left==NULL&&root->right==NULL) ){
return 0;
}
int sum = 0;
if(root->val % 2 == 0){
if(root->left != NULL){
if(root->left->left != NULL){
sum += root->left->left->val;
}
if(root->left->right != NULL){
sum += root->left->right->val;
}
}
if(root->right != NULL){
if(root->right->left != NULL){
sum += root->right->left->val;
}
if(root->right->right != NULL){
sum += root->right->right->val;
}
}
}
return sum + compute(root->left) + compute(root->right);
}
int sumEvenGrandparent(TreeNode* root) {
return compute(root);
}
};