陣列問題之七

2021-09-02 11:48:01 字數 3528 閱讀 1488

自然數陣列的排序

奇數下標都是奇數或者偶數下標都是偶數

子陣列的最大累加和問題

在陣列中找到乙個區域性最小的位置

陣列中子陣列的最大累乘積

陣列小和定義如下:

陣列s=[1,3,5,2,4,6],在s[0]的左邊小於等於s[0]的數的和為0,在s[1]的左邊小於或等於s[1]的數的和為1,在s[2]的左邊小於等於s[2]的數的和為1+3=4,以此類推,整個陣列的小和為0+1+4+1+6+15=27

給定乙個陣列s,實現函式求解陣列s的小和。

簡單的方法可以使用o(n2)空間複雜度求解,但使用歸併排序的過程中求解可以將時間複雜度降至o(nlogn),空間複雜度為o(n)

#include

#include

using

namespace std;

intmerge

(int

*&s,

int left,

int mid,

int right)

else

h[hi++

]= s[j++];

}for(;

(j < right +1)

||(i < mid +1)

; j++

, i++

) h[hi++

]= i > mid ? s[j]

: s[i]

;for

(int k =

0; k < hlen; k++

) s[left++

]= h[k]

;return smallsum;

}int

func

(int

* arr,

int l,

int r)

intgetsmallsum

(int

* arr,

int len)

intmain()

給定乙個長度為n的整型陣列arr,其中有n個互不相同的自然數1n,實現arr的排序,但是不能把下標0n-1位置上的數通過直接賦值的方式替換成1~n

要求:時間複雜度為o(n),額外空間複雜度為o(1)

#include#includeusing namespace std;

void print(int* arr, int len)

void nsort1(int* arr, int len)

} print(arr, len);

}void nsort2(int* arr, int len)

} print(arr, len);

}int main()

給定乙個長度不小於2的陣列arr,實現乙個函式調整arr,要麼讓所有的偶數下標都是偶數,要麼讓所有的奇數下標都是奇數

要求:如果arr的長度為n,函式要求時間複雜度為o(n),額外空間複雜度為o(1)

簡單題目,可以固定陣列最後乙個數進行不斷交換,知道奇數或偶數的下標大於或等於n

#include

#include

using

namespace std;

void

swap

(int

*&arr,

int index1,

int index2)

void

printnum

(int

* arr,

int len)

void

modifyevenandodd

(int

* arr,

int len)

else

}printnum

(arr, len);}

intmain()

給定乙個陣列arr,返回子陣列的最大累加和。

如arr=[1,-2,3,5,-2,6,-1],所有子陣列中,[3,5,-2,6]可以累加出最大的和12,所以返回12.

要求:如果陣列長度為n,要達到時間複雜度為o(n),額外空間複雜度為o(1)

高階問題:求書矩陣中的子矩陣的最大累加和

原問題較為簡單,乙個迴圈o(n)即可解決,高階問題需要一次計算出子矩陣對應的陣列,進一步求解累加和,時間複雜度會達到o(n^3)

#include

#include

using

namespace std;

intmaxaccsumofsubarr

(int

* arr,

int len)

return maxsum;

}/*求子矩陣的最大累加和,原理上基本與子陣列的最大累加和一致*/

intmaxsumofsubmatrix

(int

** arr,

int row,

int col)}}

return maxs;

}int

main()

for(

int i =

0; i < row; i++

)int res =

maxsumofsubmatrix

(in, row, col)

; cout << res << endl;

getchar()

;return0;

}

定義區域性最小的概念。arr長度為1時,arr[0]是區域性最小。arr長度為n(n>1)時,如果arr[0]可以使用二分查詢的方法達到o(nlogn)的時間複雜度,空間複雜度可以達到o(1),具體分析可見書籍

#include

#include

using

namespace std;

intgetlessindex

(int

* arr,

int len)

return left;

}int

main()

給定乙個double型別的陣列arr,其中元素可正可負可0,返回子陣列累乘的最大乘積。例如,arr=[-2.5,4,0,3,0.5,8,-1],子陣列[3,0.5,8]累乘可以獲得最大乘積12,返回12 即可

時間複雜度可達到o(n),空間複雜度可達到o(1);以arr[i]結尾的最大累乘積有以下幾種可能:

maxarr[i];max表示以arr[i-1]結尾陣列的最大累乘積;

minarr[i],min表示以arr[i-1]結尾陣列的最小累乘積,(min是負數,arr[i-1]也是負數)

arr[i],arr[i]為當前最大累乘積;

#include

#include

using

namespace std;

double

maxaccm

(double

* arr,

int len)

return res;

}int

main()

迷之Konigsberg七橋問題

最近在課上聽了一些關於圖論的簡介,雖然對於我現在的知識來說這個有點早了,但是不影響我明白konigsberg七橋問題。這個問題困擾了18世紀的人們很長時間,但是一直沒能得到解決,最後,大數學家男神尤拉出馬,建立了乙個簡單的數學模型,將七橋問題否定了。下面,看看這個七橋問題究竟是什麼?普魯士的koni...

java基礎學習之物件陣列 七

把物件程式設計陣列操作 例子 package wsj04 標準學生類 public class student public void setname string name public int getage public void setage int age override public s...

陣列問題之陣列最值問題 Java實現》

尋找陣列的最大值和最小值問題 author sking package 陣列問題 public class 陣列最值 if array.length 2 0 return new int 遞迴分治方法查詢陣列中的最大值和最小值 效能 比較次數為1.5 n 2 param array 當前考慮陣列段 ...