思路:dp
这道题其实确实是有点难想,而且是很难联想到做法的那种。(需要有一定的经验才行)但是如果说有了思路,其实就很简单了。
我们可以在草纸上画上一下。比如,我们以第一个数组为基准,我们换出的数组就是nums1[left].....nums1[right],换入的数组就是nums2[left]....nums2[right]。
把nums1的元素总和称为sum1,那么在交换数组的元素之后我们就得到了新的元素和sum=sum1-(nums1[left]+...nums[right])+(nums2[left]....nums[right])。
我们把上面这个式子去一下括号,按照索引下标相同的原则进行合并可以得到:
sum=sum1+(nums2[left]-nums1[left])+(nums2[left+1]-nums1[left+1])+...+(nums2[right[-nums2[right])
我们把nums2[]-nums1[]这种形式新定义一个数组就是diff,nums2[left]-nums1[left]=diff[left]这么记作。
那么上面这个式子就进一步变成了:sum=sum1+diff[left]+...diff[right].
OK,到这里,相信大家会想到有一点思路,我们是不是在前面做过最大子数组和的题目呢?我们其实是不是可以把diff数组里面的最大子数组和提取出来然后和sum1相加不就是交换之后的最大和了嘛?是的,就是这样,所以我们再对diff进行动规操作。
上面只是基于对nums1进行操作的,我们还有nums2,所以这样的操作进行两次就行,然后取最大值就行了。
上代码:
class Solution { public: int maximumsSplicedArray(vector& nums1, vector & nums2) { int n=nums1.size(); vector dp(n+1,0); int sum1=0; int sum2=0; vector diff1; vector diff2; for(int i=0;i
还没有评论,来说两句吧...