1.1、題目1
劍指 Offer 29. 順時針列印矩陣
1.2、解法
常規開頭,先判斷特殊情況,然後建立四個變數存放矩陣四邊的長度限制。
建立res陣列存放結果。
循壞開始,遍歷完一行或者一列,就將該行從矩陣的範圍內刪除,
最終判斷左邊是否大於右邊,上邊是否大於下邊來判斷迴圈是否應該結束。
1.3、程式碼
class Solution {
public int[] spiralOrder(int[][] matrix) {
if (matrix.length==0) return new int[0];
int l = 0, r=matrix[0].length-1,t=0,b=matrix.length-1,x=0;
int []res = new int[(r+1)*(b+1)];
while(true){
for(int i=l;i<=r;i++) res[x++]=matrix[t][i];
if(++t>b) break;
for(int i=t;i<=b;i++) res[x++]=matrix[i][r];
if(--r<l) break;
for(int i=r;i>=l;i--) res[x++]=matrix[b][i];
if(--b<t) break;
for(int i=b;i>=t;i--) res[x++]=matrix[i][l];
if(++l>r) break;
}
return res;
}
}
2.1、題目2
劍指 Offer 31. 棧的壓入、彈出序列
2.2、解法
這題我還以為要用什麼數學方法,結果發現用一個棧來實現這個操作就行了。
遍歷pushed陣列,每個數都判斷是否為pop的數組裡的當前元素。是的話就推出,並且pop陣列的索引+1
最終判斷棧裡是否為空則可知道順序是否正確。
2.3、程式碼
class Solution {
public boolean validateStackSequences(int[] pushed, int[] popped) {
Stack<Integer> stack = new Stack();
int x=0;
for(int i:pushed){
stack.push(i);
while(!stack.isEmpty() &&stack.peek()==popped[x] ) {
stack.pop();
x++;
}
}
return stack.isEmpty();
}
}