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();
}
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/302892.html
標籤:Java
上一篇:disruptor筆記之二:Disruptor類分析
下一篇:JAVA多執行緒
