• [leetcode]Spiral Matrix


    简单题。但做得不简洁。里面用了一个count来计数,还是不错的。因为有可能只有一行(或子状态中),那么m_low == m_high,这时,当m_low++后,m_high大于m_low,可能会从左往右和回扫都是同一行。

    public class Solution {
        public ArrayList<Integer> spiralOrder(int[][] matrix) {
            ArrayList<Integer> ans = new ArrayList<Integer>();
            int m = matrix.length;
            if (m == 0) return ans;
            int n = matrix[0].length;
            if (n == 0) return ans;
            int m_low = 0;
            int m_high = m-1;
            int n_low = 0;
            int n_high = n-1;
            int count = m*n;
            while (count > 0) {
                for (int i = n_low; i <= n_high && count > 0; i++) {
                    ans.add(matrix[m_low][i]);
                    count--;
                }
                m_low++;
                for (int i = m_low; i <= m_high && count > 0; i++) {
                    ans.add(matrix[i][n_high]);
                    count--;
                }
                n_high--;
                for (int i = n_high; i >= n_low && count > 0; i--) {
                    ans.add(matrix[m_high][i]);
                    count--;
                }
                m_high--;
                for (int i = m_high; i >= m_low && count > 0; i--) {
                    ans.add(matrix[i][n_low]);
                    count--;
                }
                n_low++;
            }
            return ans;
        }
    }
    

    Python3

    class Solution:
        def spiralOrder(self, matrix: List[List[int]]) -> List[int]:
            m = len(matrix)
            if m == 0:
                return []
            n = len(matrix[0])
            if n == 0:
                return []
            ret = []
            i = j = 0
            cnt = 0
            direction = 0 # 0, 1, 2, 3
            upper_bound = 0
            lower_bound = m - 1
            left_bound = 0
            right_bound = n - 1
            
            upper_bound += 1
            while cnt < m * n:
                ret.append(matrix[i][j])
                if direction == 0:
                    if j != right_bound:
                        j += 1
                    else:
                        right_bound -= 1
                        i += 1
                        direction = 1
                elif direction == 1:
                    if i != lower_bound:
                        i += 1
                    else:
                        lower_bound -= 1
                        j -= 1
                        direction = 2
                elif direction == 2:
                    if j != left_bound:
                        j -= 1
                    else:
                        left_bound += 1
                        i -= 1
                        direction = 3
                elif direction == 3:
                    if i != upper_bound:
                        i -= 1
                    else:
                        upper_bound += 1
                        j += 1
                        direction = 0
                cnt += 1
            return ret
                    
                    
                
    

      

  • 相关阅读:
    IMX6ULL开发板Ubuntu文件系统Ubuntu-base构建
    迅为3399开发板新增目标检测技术-RKSSD-编译程序
    国际化支持、activity生命周期、屏幕翻转的ui适配
    java调用第三方接口(转载)
    android基础控件的使用
    java并发框架--Fork-Join
    java并发框架--Executor
    多线程管理
    死锁问题
    java多线程信息共享
  • 原文地址:https://www.cnblogs.com/lautsie/p/3263192.html
Copyright © 2020-2023  润新知