给你两个有序整数数组 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--]; } } };给定一个由整数数组 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] <= 300001 <= 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; } };给你一棵二叉树,请你返回满足以下条件的所有节点的值之和:
该节点的祖父节点的值为偶数。(一个节点的祖父节点是指该节点的父节点的父节点。)如果不存在祖父节点值为偶数的节点,那么返回 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); } };
