陣列小和的定義如下:
例如,陣列s = [1, 3, 5, 2, 4, 6],在s[0]的左邊小於或等於s[0]的數的和為0;在s[1]的左邊小於或等於s[1]的數的和為1;在s[2]的左邊小於或等於s[2]的數的和為1+3=4;在s[3]的左邊小於或等於s[3]的數的和為1;
在s[4]的左邊小於或等於s[4]的數的和為1+3+2=6;在s[5]的左邊小於或等於s[5]的數的和為1+3+5+2+4=15。所以s的小和為0+1+4+1+6+15=27
給定乙個陣列s,實現函式返回s的小和
[要求]
時間複雜度為o(nlogn),空間複雜度為o(n)
輸入描述:
第一行有乙個整數n。表示陣列長度
接下來一行n個整數表示陣列內的數
輸出描述:乙個整數表示答案
示例1
6
1 3 5 2 4 6
27
備註:1⩽n⩽10^5
−100⩽arri⩽100
解:本質上是歸併排序問題,只是在每次排序之前先檢查出左邊比右邊小的資料。
#includeusing namespace std;
long mergesort(int a,int n);
long sortprocess(int a,int l,int r);
long merge(int a,int l,int mid,int r);
int main()
long merge(int *a,int l,int mid,int r)
//左右兩邊的數量不是每次都相等,將剩下的元素也新增到help陣列中
while(p1<=mid)
while(p2<=r)
for(i=0;ia[l+i]=help[i];
return rul;
}
計算陣列的小和
題目 陣列小和的定義如下 例如,陣列s 1,3,5,2,4,6 在s 0 的左邊小於或等於s 0 的數的和為0,在s 1 的左邊小於或等於s 1 的數的和為1,在s 2 的左邊小於或等於s 2 的數的和為1 3 4,在s 3 的左邊小於或等於s 3 的數的和為1,在s 4 的左邊小於或等於s 4 的...
陣列與矩陣 計算陣列的小和
題目 陣列小和的定義如下 例如 陣列s 1,3,5,2,4,6 在s 0 的左邊小於或者等於s 0 的數的和為0,在s 1 的左邊小於或等於s 1 的數的和為1 將所有位置的左邊比它小或者等於的數的和相加起來就是小和。給定乙個陣列,實現函式返回s的小和。基本思路 最簡單易懂的方法,就是依次遍歷陣列每...
計算陣列的子集
計算某個陣列的子集 在遞迴中不用 for迴圈和 visit 陣列,因為每個結果長度不一致,如果每個結果長度一致,比如求全排列,則需要用 for和 visit 但後者也可以用記錄層數的方式 public class main list li new arraylist fin nums,li,new ...