陣列的相關演算法

2021-10-24 03:58:22 字數 3739 閱讀 5585

目錄

1 陣列找最值

2 陣列統計:求總和、均值、統計偶數個數等

3 反轉

4 複製

5 查詢

6 排序

1、陣列中找最值

思路:(1)先假設第乙個元素最大/最小

(2)然後用max/min與後面的元素一一比較

示例**:

int arr = ;

//找最大值

int max = arr[0];

for(int i=1; imax)

}

2、陣列中找最值及其下標

情況一:找最值及其第一次出現的下標

思路:(1)先假設第乙個元素最大/最小

(2)然後用max/min與後面的元素一一比較

示例**:

int arr = ;

//找最大值

int max = arr[0];

int index = 0;

for(int i=1; imax)

}

int arr = ;

//找最大值

int maxindex = 0;

for(int i=1; iarr[maxindex])

}system.out.println("最大值:" + arr[maxindex]);

情況二:找最值及其所有最值的下標(即可能最大值重複)

思路:(1)先找最大值

①假設第乙個元素最大

②用max與後面的元素一一比較

(2)遍歷陣列,看哪些元素和最大值是一樣的

示例**:

int arr = ;

//找最大值

int max = arr[0];

for(int i=1; imax)}​

//遍歷陣列,看哪些元素和最大值是一樣的

for(int i=0; i思路:遍歷陣列,挨個的累加,判斷每乙個元素

示例**:

int arr = ;

//求總和、均值

int sum = 0;//因為0加上任何數都不影響結果

for(int i=0; i示例**2:

int arr = ;

​//求總乘積

long result = 1;//因為1乘以任何數都不影響結果

for(int i=0; i示例**3:

int arr = ;

//統計偶數個數

int even = 0;

for(int i=0; i方法有兩種:

1、借助乙個新陣列

2、首尾對應位置交換

第一種方式示例**:

int arr = ;

​//(1)先建立乙個新陣列

int newarr = new int[arr.length];

​//(2)複製元素

int len = arr.length;

for(int i=0; i第二種方式示例**:

int arr = ;

​//(1)計算要交換的次數: 次數 = arr.length/2

//(2)首尾交換

for(int i=0; i應用場景:

1、擴容

2、備份

3、擷取

示例**:擴容

int arr = ;

​//如果要把arr陣列擴容,增加1個位置

//(1)先建立乙個新陣列,它的長度 = 舊陣列的長度+1

int newarr = new int[arr.length + 1];

​//(2)複製元素

//注意:i示例**:備份

int arr = ;

​//1、建立乙個長度和原來的陣列一樣的新陣列

int newarr = new int[arr.length];

​//2、複製元素

for(int i=0; i示例**:擷取

int arr = ;

​int start = 2;

int end = 5;

​//1、建立乙個新陣列,新陣列的長度 = end-start + 1;

int newarr = new int[end-start+1];

​//2、賦值元素

for(int i=0; i查詢分為兩種:

1、順序查詢:挨個看

​ 對陣列沒要求

2、二分查詢:對折對折再對折

​ 對陣列有要求,元素必須有大小順序的

順序查詢示例**:

int arr = ;

int value = 1;

int index = -1;

​for(int i=0; i二分查詢示例**:

/*2、編寫**,使用二分查詢法在陣列中查詢 int value = 2;是否存在,如果存在顯示下標,不存在顯示不存在。

已知陣列:int arr = ;

*/

class exam2;//陣列是有序的

int value = 2;

int index = -1;

int left = 0;

int right = arr.length - 1;

int mid = (left + right)/2;

while(left<=right)//沒找到

else if(value > arr[mid])else if(value < arr[mid])

mid = (left + right)/2;

}if(index==-1)else

}}

使用for

class exam2;//陣列是有序的

int value = 2;

int index = -1;

for(int left=0,right=arr.length-1,mid = (left+right)/2; left<=right; mid = (left + right)/2)//沒找到

else if(value > arr[mid])else if(value < arr[mid])

}if(index==-1)else

}}

陣列的排序演算法有千萬種,我們只講了兩種:

1、氣泡排序

2、簡單的直接排序

示例**:冒泡:從小到大,從左到右兩兩比較

int arr = ;

for(int i=1; iarr[j+1])

}}

示例**:從大到小,從右到左

char arr = ;

for(int i=1; i=i

*/for(int j=8; j>=i; j--)

}}

示例**:簡單的直接選擇排序

int arr = ;

​for(int i=1; imax)

}//(2)如果這個最值沒有在它應該在的位置,就與這個位置的元素交換

/*第1輪,最大值應該在[0]

第2輪,最大值應該在[1]

第3輪,最大值應該在[2]

第4輪,最大值應該在[3]

正好是i-1的值

*/if(index != i-1)}​

​​//顯示結果

for(int i=0; i

陣列相關演算法

問題1 列印1到最大的n位數 解法 一 直接求出n位數的最大值,然後直接從1開始列印 缺陷 可能會溢位,大數問題 void print1tomax int n for int i 1 icout cout 二 在字串上模擬數字加法 void print1tomax int n bool increm...

陣列相關演算法

1.尋找最小的k個數 有n個整數,請找出其中最小的k個數,要求時間複雜度盡可能低。全部排序。使用快速排序演算法排序之後並且輸出最小的k個數,時間複雜度為o nlogn def quick sort array,left,right if left right return low left high...

陣列求和相關演算法

問題1 輸入乙個陣列,在陣列中查詢兩個數,使得它們的和正好是target void findtwosum int a,int n,int target 問題2 輸入整數sum,找出所有和為sum的連續整數序列,至少包含兩個。例如輸入15,由於1 2 3 4 5 4 5 6 7 8 15,所有結果列印...