第一次刷题发现自己的脑子里全是浆糊,看题目都要看几遍才懂。(这就是粘贴复制的后遗症吧)。好了废话不多说了直接上题。
这道题属于中等,可以用暴力算法进行计算,进阶的话,有点难想,进阶要求设计一种时间复杂度为O(n)的解决方案。先说一下暴力算法,一谈到数组首先想到的就是遍历数组,将所有情况都列出来然后累加。很多时候,暴力算法主要的难点是怎么将所有情况列出来。好的,我们再来审一下题,题目要求我们计算所有子数组中每个子数组中最大值和最小值的差的累加和。我们首先在草稿纸演示一下算法流程。
上图是列出全部子数组的流程,从图中可知,要列出所有子数组有两个方向增加,所以要用到双循环。现在我们可以列出所有子数组,然后我们要思考如何计算每个子数组的最大值和最小值。一看到最大值和最小值,我们需要定义两个变量存储最大值和最小值(因为我们不能改变数组里面的值)。现在我们先实现遍历数组。
long long sub(vector& nums){
long long ans;
for(int i = 0; i < nums.length; i++){
int max=nums[i],min=nums[i];
for(int j = i; j
现在就是思考如何计算每个子数组中的最大值和最小值,我们看一下第二个for循环,我们可以在第二个for循环中更新最大值和最小值。第一个for循环只是将最大值和最小值初始化为子数组上的第一个数,然后第二个for循环就是不断的更新子数组的最大值和最小值 ,(其实j = i + 1也可以)。
long long sub(vector& nums){
long long ans;
for(int i = 0; i < nums.length; i++){
int max=nums[i],min=nums[i];
for(int j = i; j < nums.length; j++){
max = math.max(max ,nums[j]);
min = math.min(min, nums[i]);
ans += max - min;
}
}
return ans;
}
进阶的话,后续分解
暴力求解的话,主要考察的数组的遍历以及定1走1。当变量多的时候,先固定一个让另一个进行变化。