dedecms 视频网站模板/semi final
思路:
- 定义表示四条边的变量l,r,t,b表示左右上下
- 按照顺序遍历上右下左四条边,每遍历一条边该范围缩小1,比如上边遍历完,则t减一。定义一个计数变量num,当num等于所有元素数量之和则跳出循环
- 注意有可能在循环结束前已经超过了范围,所以在遍历四条边时候,也要加上条件num <= total
class Solution:def spiralOrder(self, matrix: List[List[int]]) -> List[int]:l=0r=len(matrix[0])-1t=0b=len(matrix)-1total=len(matrix)*len(matrix[0])num=1res=[]while num<=total:for i in range(l,r+1) :if num<=total:res.append(matrix[t][i])num+=1t+=1for i in range(t,b+1):if num <= total:res.append(matrix[i][r])num+=1r-=1for i in range(r,l-1,-1) :if num <= total:res.append(matrix[b][i])num+=1b-=1for i in range(b,t-1,-1):if num <= total:res.append(matrix[i][l])num+=1l+=1return res
class Solution {public int[] spiralOrder(int[][] matrix) {if(matrix.length==0) return new int[0];int t=0,b=matrix.length-1,l=0,r=matrix[0].length-1;int num=0;int total=matrix.length*matrix[0].length;List<Integer>res=new ArrayList<>();while(num<total){for(int i=l;i<=r;i++){if(num<total){res.add(matrix[t][i]);num+=1;}}t++;for(int i=t;i<=b;i++){if(num<total){res.add(matrix[i][r]);num++;}}r--;for(int i=r;i>=l;i--){if(num<total){res.add(matrix[b][i]);num++;}}b--;for(int i=b;i>=t;i--){if(num<total){res.add(matrix[i][l]);num++;}}l++;}int[]ret=new int[res.size()];for(int i=0;i<res.size();i++){ret[i]=res.get(i);}return ret;}
}