演算法知識梳理 4 陣列第一部分

2021-09-11 11:34:46 字數 3359 閱讀 8744

在乙個二維陣列中,每一行都按照從左到右遞增的順序,每一列都按照從上到下遞增的順序排序,編寫乙個函式,輸入這樣的乙個二維陣列和乙個整數,判斷該整數是否在二位陣列中。

首先要確定整數存在於陣列的乙個前提條件:如果最小的元素(左上角)大於d,或者最大的元素(右下角)小於d,那麼可以確定矩陣中不存在d

這裡需要關注乙個特殊的點,二維陣列右上角的元素d,如果以d所在的列將陣列分為左右兩個部分,那麼右邊部分的所有元素都是大於d的;而如果以d所在的行將陣列分為上下兩個部分,那麼上半部分的所有元素都是小於d的。利用這一特性,我們從陣列的右上角開始搜尋:

class

untitled

//不斷縮小矩形的範圍。

while (p[minx][maxy] > d) //從右上角的第乙個元素,從右往左,找到第乙個不大於d的元素。

maxy -= 1;

while (p[minx][maxy] < d) //從右上角的第乙個元素,從上到下,找到第乙個不小於d的元素。

minx += 1;

} return

false;

} public

static

void

main

(string args)

, , , };

system.out.println("result=" + searchmisint(p, 10, 3, 3)); }}

複製**

>> result=true

複製**

把乙個陣列最開始的若干個元素搬到陣列的末尾,稱為陣列的旋轉。現在輸入乙個遞增序列的旋轉陣列,輸出旋轉陣列的最小值,例如的乙個旋轉陣列為,最小值為1

加入經過旋轉後的陣列不等於它本身,那麼這個旋轉後的陣列有乙個特點:它以最小值作為分界點被分為兩個部分,不包含最小值的前半部分是有序的,包含最小值的後半部分也是有序的,因此我們可以借助二分查詢的思想。

首先獲得當前陣列的中點位置pmid

class

untitled

int pstart = 0;

int pmid = 0;

int pend = length-1;

if (p[pstart] < p[pend])

while (pstart < pend - 1)

if (p[pstart] > p[pend])

return p[pend];

return -1;

} static

introtateminindexorder

(int p, int pstart, int pend)

return pend;

} public

static

void

main

(string args)

; system.out.println("result=" + rotateminindex(p, 5)); }}

複製**

>> result=1

複製**

輸入乙個整數陣列,實現乙個函式來調整該陣列中數字的順序,使得所有奇數字於陣列的前半部分,所有偶數字於陣列的後半部分。

通過兩個變數pstartpend分別記錄從首節點和末節點開始掃瞄的下標,pstart從首節點向末節點開始掃瞄,如果找到乙個偶數,那麼停止掃瞄,讓pend從末節點向首節點開始掃瞄,直到找到乙個奇數,然後和pstart所指向的偶數交換,這樣就能保證[0, pstart]之間的都是奇數,而[pend, len-1]之間的都是偶數。

完成交換後,再開始移動pstart尋找下乙個偶數,重複上面的操作,直到pstartpend相遇,就可以滿足問題的要求了。

class

untitled

} static

void

reverseoddeven

(int p, int length)

} public

static

void

main

(string args)

; reverseoddeven(p, p.length);

printarray(p); }}

複製**

>> 3,1,5,4,2,

複製**

找出陣列**現次數超過一半的數字

將整個陣列中的元素看成兩類:出現次數超過一半的數字其餘數字。利用乙個輔助的變數timed,初始時候將d設為p[0]time設為1,開始從頭開始遍歷陣列。

class

untitled

if ((time << 1) >= length)

return

true;

return

false;

} static

void

morethanhalf

(int p, int length)

else

if(d == p[i])

time += 1;

else

time -= 1;

} if (verifymorethanhalf(p, d, length)) else

} public

static

void

main

(string args)

; morethanhalf(p, p.length); }}

複製**

>> 出現次數超過一半的元素=2

複製**

演算法第一部分(1)

1.學習演算法,最好先了解陣列,鍊錶,堆,棧等線性結構 2.對遞迴,遍歷,演算法複雜度有著常識性理解 3.主要包括三方面的知識 線性 主要是排序 樹形結構 圖形結構 定義 選擇排序每次都從剩下的n i 個元素找到最小的數,並與i位置的數交換位置。public void selectionsort t...

Axure RP 第一部分

axure rp是乙個專業的快速原型設計工具。axure 發音 ack sure 代表美國axure公司 rp則是rapid prototyping 快速原型 的縮寫。axure rp是美國axure software solution公司旗艦產品,是乙個專業的快速原型設計工具,讓負責定義需求和規格...

第一部分 基礎知識

之前一直想看下神書演算法導論,由於種種原因一直沒有仔細研讀,從今天開始,接下來乙個乙個多月的時間裡,爭取一天一章內容,認真研讀這本書。非形式地說,演算法就是任何良定義的計算過程,該過程取某個值或值的集合作為輸入並產生某個值或或值的集合作為輸出。這樣演算法就是吧輸入轉換成輸出的計算步驟的乙個序列。若對...