题目

image.png
跟下一道题的区别就在于,这不是个方阵。行列不相等。

思路

对比我的写法和大佬写法,有几个缺点:

  1. 一开始没有判空
  2. while循环条件设置不好

    1. var spiralOrder = function(matrix) {
    2. let result =[]
    3. let left =0
    4. let right =matrix[0].length -1
    5. let top =0
    6. let bottom =matrix.length -1
    7. let num =1
    8. let total =matrix.length * matrix[0].length
    9. while(num<=total){
    10. for(let i =left;i<=right;i++){
    11. result.push(matrix[top][i])
    12. num++
    13. }
    14. if(num>total)break
    15. top++
    16. for(let i =top;i<=bottom;i++){
    17. result.push(matrix[i][right])
    18. num++
    19. }
    20. if(num>total)break
    21. right--
    22. console.log(left,right)
    23. for(let i =right;i>=left;i--){
    24. result.push(matrix[bottom][i])
    25. num++
    26. }
    27. if(num>total)break
    28. bottom--
    29. for(let i =bottom;i>=top;i--){
    30. result.push(matrix[i][left])
    31. num++
    32. }
    33. if(num>total)break
    34. left++
    35. }
    36. return result
    37. };

    结合我的理解和官方的最终代码

    1. var spiralOrder = function(matrix) {
    2. // 虽然这道题不用判断,但我没有这个思维
    3. if(!matrix.length || !matrix[0].length) return []
    4. let result =[]
    5. let left =0
    6. let right =matrix[0].length -1
    7. let top =0
    8. let bottom =matrix.length -1
    9. while(left<=right &&top<=bottom){
    10. // 左闭右闭,比官方解答里一部分左闭右闭一部分左闭右开好理解。
    11. for(let i =left;i<=right;i++){
    12. result.push(matrix[top][i])
    13. }
    14. for(let i =top+1;i<=bottom;i++){
    15. result.push(matrix[i][right])
    16. }
    17. // 最重要就是在从右往左和从下往上的时候,再判断一下是否超出边界。
    18. if(left<right &&top<bottom){
    19. for(let i =right-1;i>=left;i--){
    20. result.push(matrix[bottom][i])
    21. }
    22. for(let i =bottom-1;i>=top+1;i--){
    23. result.push(matrix[i][left])
    24. }
    25. }
    26. [left, right, top, bottom] = [left + 1, right - 1, top + 1, bottom - 1]
    27. }
    28. return result
    29. };

    原官方代码

    1. var spiralOrder = function(matrix) {
    2. if (!matrix.length || !matrix[0].length) {
    3. return [];
    4. }
    5. const rows = matrix.length, columns = matrix[0].length;
    6. const order = [];
    7. let left = 0, right = columns - 1, top = 0, bottom = rows - 1;
    8. while (left <= right && top <= bottom) {
    9. for (let column = left; column <= right; column++) {
    10. order.push(matrix[top][column]);
    11. }
    12. for (let row = top + 1; row <= bottom; row++) {
    13. order.push(matrix[row][right]);
    14. }
    15. if (left < right && top < bottom) {
    16. for (let column = right - 1; column > left; column--) {
    17. order.push(matrix[bottom][column]);
    18. }
    19. for (let row = bottom; row > top; row--) {
    20. order.push(matrix[row][left]);
    21. }
    22. }
    23. [left, right, top, bottom] = [left + 1, right - 1, top + 1, bottom - 1];
    24. }
    25. return order;
    26. };