leetcode題解(陣列問題)

2021-09-11 12:05:30 字數 4332 閱讀 6788

面試中的演算法問題,有很多並不需要複雜的資料結構支撐。就是用陣列,就能考察出很多東西了。其實,經典的排序問題,二分搜尋等等問題,就是在陣列這種最基礎的結構中處理問題的,今天主要學習常見的陣列中處理問題的方法。

template

intbinarysearch

( t arr, int n, t target )

return

-1; }

複製**

** 迴圈不變數。宣告不變。控制邊界。**

int l = 0, r = n-1; // 在[l...r]的範圍裡尋找target:前閉後閉

複製**

template

intbinarysearch

( t arr, int n, t target )

return

-1; }

複製**

注意

class

solution

};int

main();

//根據生成的資料建立vector:傳入頭指標和尾指標

vector

vec(arr, arr + sizeof(arr)/sizeof(int));

solution().movezeroes(vec);

for( int i = 0 ; i < vec.size() ; i ++ )

cout

<" ";

cout

0; }

複製**

class

solution

};int

main();

vector

vec(arr, arr + sizeof(arr)/sizeof(int));

solution().movezeroes(vec);

for( int i = 0 ; i < vec.size() ; i ++ )

cout

<" ";

cout

0; }

複製**

class

solution

};複製**

** 極端情況:如果都為非0,則每個都自己和自己交換**

class

solution

};複製**

注意的問題

// 時間複雜度: o(n)

// 空間複雜度: o(k), k為元素的取值範圍

// 對整個陣列遍歷了兩遍

class

solution ; // 存放0,1,2三個元素的頻率

for( int i = 0 ; i < nums.size() ; i ++ )

int index = 0;

for( int i = 0 ; i < count[0] ; i ++ )

nums[index++] = 0;

for( int i = 0 ; i < count[1] ; i ++ )

nums[index++] = 1;

for( int i = 0 ; i < count[2] ; i ++ )

nums[index++] = 2;

// 小練習: 更加自使用的計數排序}};

intmain();

vector

vec = vector

( nums , nums + sizeof(nums)/sizeof(int));

solution().sortcolors( vec );

for( int i = 0 ; i < vec.size() ; i ++ )

cout

<" ";

cout

0; }

複製**

可以只掃瞄一遍麼?

一次三路快排

設定三個索引:zero two i

三路快排

// 時間複雜度: o(n)

// 空間複雜度: o(1)

// 對整個陣列只遍歷了一遍

class

solution }}

};int

main();

vector

vec = vector

( nums , nums + sizeof(nums)/sizeof(int));

solution().sortcolors( vec );

for( int i = 0 ; i < vec.size() ; i ++ )

cout

<" ";

cout

0; }

複製**

需要考慮的問題

二分搜尋法

對撞指標

// 時間複雜度: o(n)

// 空間複雜度: o(1)

class

solution ;

return

vector

(res, res+2);

}else

if( numbers[l] + numbers[r] < target )

l ++;

else

// numbers[l] + numbers[r] > target

r --;

}throw invalid_argument("the input has no solution");}};

複製**

344 reverse string

345 reverse vowels of a string

11 container with most water

什麼是子陣列

暴力解o(n^3)

**實現

int

minsubarraylen

(int s, vector

& nums)

if(res == nums.size() + 1)

return

0; return res;

}複製**

暴力解的優化o(n^2)
int

minsubarraylen

(int s, vector

& nums)

if(res == nums.size() + 1)

return

0; return res;

}複製**

滑動視窗解

// 滑動視窗的思路

// 時間複雜度: o(n)

// 空間複雜度: o(1)

class

solution else

if(sum >= s)

}if(res == nums.size() + 1)

return

0; return res;

}};複製**

注意

字符集?只有字母?數字+字母?ascii?

大小寫是否敏感?

class

solution ;

int l = 0, r = -1; //滑動視窗為s[l...r]

int res = 0;

// 整個迴圈從 l == 0; r == -1 這個空視窗開始

// 到l == s.size(); r == s.size()-1 這個空視窗截止

// 在每次迴圈裡逐漸改變視窗, 維護freq, 並記錄當前視窗中是否找到了乙個新的最優值

while( l < s.size() )

return res;}};

intmain

()

複製**

76 minimum window substring

-------------------------華麗的分割線--------------------

看完的朋友可以點個喜歡/關注,您的支援是對我最大的鼓勵。

個人部落格番茄技術小棧和掘金主頁

題解 數字梯形問題

這樣一道傻題我調了這麼久 三個任務建圖是這樣的,由於太簡單就不xjb解釋了,乙個點拆位入點和出點 graph lr s w 1,c 1 入點1 入點1 w 1,c 點權1 出點1 入點2 w 1,c 點權2 出點2 入點3 w 1,c 點權2 出點3 出點1 w 1,c 0 入點2 出點1 w 1,...

數獨問題 解數獨

數獨是乙個非常有名的遊戲。整個是乙個9x9的大宮格,其中又被劃分成9個3x3的小宮格。要求在每個小格中放入1 9中的某個數字。要求是 每行 每列 每個小宮格中數字不能重複。現要求用計算機求解數獨。輸入描述 輸入9行,每行為空格隔開的9個數字,為0的地方就是需要填充的數字。輸出描述 輸出九行,每行九個...

題解 資料結構 樹狀陣列2

接著上文 說 上文題目打太多了,卡的很 這道題如果還像上一題那樣建樹狀陣列,必然超時 我們要發揮自己模仿的天分,使得原封不動地搬下來就可以a了 前面說到跟上題一樣建樹狀陣列要超時,那我們倒過來,使得單點訪問變為sum,區間修改變為update,有同學肯定想到了差分陣列 沒錯就是他 我們在區間修改,就...