劍指Offer(13)順時針打印矩陣 包含min的棧
題目:
輸入一個矩陣,按照從外向裏以順時針的順序依次打印出每一個數字,例如,如果輸入如下4 X 4矩陣:
1 2 3 4
5 6 7 8
9 10 11 12
13 14 15 16
則依次打印出數字1,2,3,4,8,12,16,15,14,13,9,5,6,7,11,10.
思路:
12
34 輸出爲 1243
對於任意一個矩陣,可以找到他的位於正對角線兩邊界的元素,
1234
5678
4329 對於這個矩陣 第一個邊界元素是1 ,第二個邊界元素是9。
假設 1 的座標爲 (row1,cow1)
假設 9 的座標爲 (row2,cow2)
對於任意一個矩陣,都可以
從 cow1++到 cow2 其中row不變 輸出每個元素 第一行
然後 row1 ++ 到 row2 其中cow不變 輸出每個元素 最後一列
然後 cow2-- 到cow1 其中row不變 輸出每個元素 最後一行
row2-- 到row1 其中cow不變 輸出每個元素。 第一列
當完成一次循環時,(row1++,colw1++) 如果此時沒有出現 row1>=row2 則繼續上面的函數輸出。
代碼:
ArrayList arrayList = new ArrayList();
public ArrayList<Integer> printMatrix(int[][] matrix)
{
int row1 = 0;
int cow1= 0;
int row2 = matrix.length - 1;
int cow2= matrix[0].length - 1;
while (cow1 <= cow2 && row1 <= row2) {
printEdge1(matrix, row1++, cow1++, row2--, cow2--);
}
return arrayList;
}
public void printEdge1(int[][] m, int row1, int cow1, int row2, int cow2)
{
if(row1==row2)
{
for (int i = cow1; i <= cow2; i++)
{
arrayList.add(m[row1][i]);
//只有一行, 遍歷每列
}
}
else if (cow1==cow2)
{
for (int i = row1; i <= row2; i++)
{
arrayList.add(m[i][cow1]);
//只有一列 遍歷每行
}
}
else
{
int c=cow1;
int r=row1;
while(c!=cow2)
{
arrayList.add(m[row1][c]);
// 左到右
c++;
}
while(r!=row2)
{
arrayList.add(m[r][cow2]);
//上到下
r++;
}
while(c!=cow1)
{
arrayList.add(m[row2][c]);
// 右到左
c--;
}
while(r!=row1)
{
arrayList.add(m[r][cow1]);
// 下到上
r--;
}
}
}
題目:
定義棧的數據結構,請在該類型中實現一個能夠得到棧中所含最小元素的min函數(時間複雜度應爲O(1)。
思路:
要求如果當前最小元素的棧被彈出了,如何得到下一個最小的元素呢?
處理方法是建立一個輔助棧,每次入棧前將當前元素a與輔助棧裏的頂部元素b比較,如果a>b,則入棧一個b,反之入棧a.
代碼:
private Stack<Integer> dataStack=new Stack<>();
private Stack<Integer> helpStack=new Stack<>();
public void push(int node) {
dataStack.push(node);
if (helpStack.isEmpty())
helpStack.push(node);
else
helpStack.push(Math.min(node,helpStack.peek()));
}
public void pop() {
dataStack.pop();
helpStack.pop();
}
public int top() {
return dataStack.peek();
}
public int min() {
return helpStack.peek();
}