面試中的演算法問題,有很多並不需要複雜的資料結構支撐。就是用陣列,就能考察出很多東西了。其實,經典的排序問題,二分搜尋等等問題,就是在陣列這種最基礎的結構中處理問題的,今天主要學習常見的陣列中處理問題的方法。
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,有同學肯定想到了差分陣列 沒錯就是他 我們在區間修改,就...