子数组的最小值之和(failed)

给定一个整数数组 A,找到 min(B) 的总和,其中 B 的范围为 A 的每个(连续)子数组。

由于答案可能很大,因此返回答案模 10^9 + 7

 

示例:

输入:[3,1,2,4]
输出:17
解释:
子数组为 [3],[1],[2],[4],[3,1],[1,2],[2,4],[3,1,2],[1,2,4],[3,1,2,4]。 
最小值为 3,1,2,4,1,1,2,1,1,1,和为 17。

 

提示:

  1. 1 <= A <= 30000
  2. 1 <= A[i] <= 30000

个人TLE答案 暴力法 就不发了 On3 丢人

拿第一的dalao(@cai_lw)的答案来分析一波 (以后

typedef long long ll;
class Solution {
    const int P=1000000007;
public:
    int sumSubarrayMins(vector<int>& a) {
        int n=a.size();
        vector<int> l(n,-1),r(n,n),st;
        for(int i=0;i<n;i++){
            while(!st.empty()&&a[st.back()]>a[i])st.pop_back();
            if(!st.empty())l[i]=st.back();
            st.push_back(i);
        }
        st.clear();
        for(int i=n-1;i>=0;i--){
            while(!st.empty()&&a[st.back()]>=a[i])st.pop_back();
            if(!st.empty())r[i]=st.back();
            st.push_back(i);
        }
        int ans=0;
        for(int i=0;i<n;i++){
            int d=r[i]-l[i]-1;
            ans=(ll(ans)+ll(i-l[i])*ll(r[i]-i)*ll(a[i]))%P;
        }
        return ans;
    }
};

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
以下是两个函数的代码: ```c #include <stdio.h> #include <stdlib.h> int find_max_min(int arr[], int len, int* max, int* min) { if (len == 0) { return -1; } *max = *min = arr[0]; for (int i = 1; i < len; i++) { if (arr[i] > *max) { *max = arr[i]; } if (arr[i] < *min) { *min = arr[i]; } } return 0; } int get_array_size(int arr[]) { return sizeof(arr) / sizeof(arr[0]); } ``` 在这里,第一个函数 `find_max_min` 接收一个整型数组数组长度,以及两个指针,用于返回最大值和最小值。该函数会在数组中查找最大值和最小值,并将结果存储到指针所指向的变量中,最后返回 0 表示执行成功。 第二个函数 `get_array_size` 只接收一个整型数组,返回数组的长度。 可以使用以下命令将这两个函数编译成库文件: ```bash gcc -shared -o libarray_utils.so array_utils.c ``` 这里使用了 `-shared` 参数来生成共享库文件,`-o` 参数指定输出文件名为 `libarray_utils.so`,`array_utils.c` 则是包含两个函数实现的源文件名。 在编译完成后,可以在其他程序中使用该库。以下是一个示例程序,用于测试这两个函数: ```c #include <stdio.h> #include <stdlib.h> #include "array_utils.h" #define ARRAY_SIZE 5 int main() { int arr[ARRAY_SIZE] = {1, 2, 3, 4, 5}; int max, min; int ret = find_max_min(arr, ARRAY_SIZE, &max, &min); if (ret != 0) { printf("Failed to find max and min value!\n"); return -1; } printf("Max value: %d\n", max); printf("Min value: %d\n", min); int size = get_array_size(arr); printf("Array size: %d\n", size); return 0; } ``` 在这个程序中,我们首先包含了 `array_utils.h` 头文件来引入两个函数的声明。然后我们定义了一个整型数组,调用 `find_max_min` 函数来查找数组中的最大值和最小值,并输出结果。最后我们调用 `get_array_size` 函数,输出数组的长度。 可以使用以下命令编译该程序: ```bash gcc -o test test.c -L. -larray_utils ``` 这里使用 `-L` 参数指定了共享库文件所在的目录,`-l` 参数指定了库文件名,`test.c` 则是包含测试程序的源文件名。编译完成后,可以使用以下命令运行测试程序: ```bash ./test ``` 程序会输出以下结果: ``` Max value: 5 Min value: 1 Array size: 5 ``` 这说明我们编写的两个函数都能正常工作,库文件也能被正确链接和使用。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值