不断改进网站建设中国制造网是做什么的
不断改进网站建设,中国制造网是做什么的,青岛网站美工,珠海企业网站建设Problem: 907. Sum of Subarray Minimums 子数组的最小值之和 内存100%#xff0c;统计了每个数字的贡献#xff0c;像 3 1 2 4, 3只贡献了1次#xff0c;1贡献了 2 * 3 6 次#xff0c;2贡献了2次#xff0c;4贡献了1次
上面1的贡献次数#xff0c;是统计左侧1的个…Problem: 907. Sum of Subarray Minimums 子数组的最小值之和内存100%统计了每个数字的贡献像 3 1 2 4, 3只贡献了1次1贡献了 2 * 3 6 次2贡献了2次4贡献了1次上面1的贡献次数是统计左侧1的个数23 1和1统计右侧1的个数31和1 2和1 2 4当出现相邻重复数字的时候像3 3只统计左侧共3个子数组3 3 3 3Codeclass Solution { public: const int modulo 1e9 7; int sumSubarrayMins(vectorint arr) { int l, r, n arr.size(); long long sum 0; for(int i 0; i n; i) { l i - 1; r i 1; while(l 0 arr[l] arr[i]) l--; while(r n arr[r] arr[i]) r; sum ( ((long long)arr[i] * (long long)(i - l) * (long long)(r - i)) % modulo ); sum % modulo; } return sum; } };官方题解使用单调栈求出了每个数字左右的长度时间复杂度减少到O(n)class Solution { public: const int modulo 1e9 7; int sumSubarrayMins(vectorint arr) { int l, r, n arr.size(); long long sum 0; vectorint stackmono; vectorint left(n), right(n); for(int i 0; i n; i) { while(stackmono.size() 0 arr[i] arr[stackmono.back()]) { stackmono.pop_back(); } left[i] i - (stackmono.size()0? -1 : stackmono.back()); stackmono.emplace_back(i); } stackmono.clear(); for(int i n-1; i 0; i--) { while(stackmono.size() 0 arr[i] arr[stackmono.back()]) { stackmono.pop_back(); } right[i] (stackmono.size()0? n : stackmono.back()) - i; stackmono.emplace_back(i); } for(int i 0; i n; i) { sum (sum (long long)arr[i] * (long long)left[i] * (long long)right[i]) % modulo; } return sum; } };