lintcode入门篇六

185. 矩阵的之字型遍历

给你一个包含 m x n 个元素的矩阵 (m 行, n 列), 求该矩阵的之字型遍历。

样例

样例 1:
	输入: [[1]]
	输出:  [1]

样例 2:
	输入:
	[
    [1, 2,  3,  4],
    [5, 6,  7,  8],
    [9,10, 11, 12]
  ]

	输出:  [1, 2, 5, 9, 6, 3, 4, 7, 10, 11, 8, 12]
class Solution:
    ‘‘‘
    1.首先i,j都不能小于0,并且i<len(matrix) and j<len(matrix[0])
    2.一开始是往上右,upright = True
    3.如果是upright = True的话,下一个值就是i-1,j+1,否则i+1,j-1
    4.如果i<0或者j<0,则代表需要转换方向,upright=False或者True:
    如果转换方向,此时的upright =True的话,此时得分情况:
    (1).一种是j在范围内(即j<=len(matrix)-1,那么需要往右边走,j+1,i不变(此时不仅要回退到原来的i和j,而且j需要再加1)
    (2).一种是j出范围(即j==len(matrix)),那么需要往下走,i+1(此时不仅需要回退到原来的i和j,而且i需要再加1)
    如果转换方向,此时的upright =True的话,此时得分情况:
    (1).和上述相反
    (2).和上述相反
    ‘‘‘
    def printZMatrix(self,matrix):
        upright = True
        res=[]
        i,j=0,0
        IsOut = False
        while True:
            if upright == True:
                ##在此下运行的条件
                while i>=0 and j>=0 and i <= len(matrix)-1 and j<=len(matrix[0])-1:                    ##终止条件
                    if i == len(matrix)-1 and j == len(matrix[0])-1:
                        IsOut = True
                        break
                    res.append(matrix[i][j])
                    print(‘upright=True:‘+str(res[-1]))
                    i = i-1
                    j = j+1
                else:
                    if j == len(matrix[0]):
                        i = i+2
                        j = j-1
                    else:
                        i = i+1
                    upright = False
            print(upright)
            if upright == False:
                print(‘enter‘)
                while i>=0 and j>=0 and i <= len(matrix)-1 and j<=len(matrix[0])-1:
                    if i == len(matrix)-1 and j == len(matrix[0])-1:
                        IsOut = True
                        break
                    res.append(matrix[i][j])
                    i = i+1
                    j = j-1
                    print(‘upright=False:‘+str(res[-1]))
                else:
                    if (i == len(matrix)):
                        i = i-1
                        j = j+2
                    else:
                        j = j+1
                    upright = True
            if IsOut == True:
                res.append(matrix[-1][-1])
                break
        return res

大致解释:(折腾了两小时,终于搞定,略显累赘)

1.写入的顺序是先往右上,在往左下,在往右上,在往左下,依次写入,直到i=len(matrix)  and  j = len(matrix[0])-1。

2.如果upright=True的话,取下一个元素是i-1,j+1

(1).upright=True的时候,如果i<0或者j>len(matrix)-1的时候,说明需要进行转换(即换方向)。

i<0,此时需要往右边走,i和j需要回退到原来的值,并且j需要再加1.

j>len(matrix)-1,此时需要往下走,i和j需要回退到原来的值,并且i需要在加1

(2).upright=False,和上述情况相反。

原文地址:https://www.cnblogs.com/yunxintryyoubest/p/12406164.html

时间: 2024-10-09 06:07:27

lintcode入门篇六的相关文章

【SSRS】入门篇(六) -- 分组和总计

原文:[SSRS]入门篇(六) -- 分组和总计 通过[SSRS]入门篇(五) -- 设置报表格式的设计,一份简单格式的报表已产生,如下图: 这节来说说分组和总计: 根据日期.订单对数据进行分组 添加订单总计 添加每日总计 添加总计 对数据进行分组: 1.单击"设计"选项页.(如果看不到"行组.列组"窗格,右键单击设计图画,选择"视图 -> 分组".) 2.从"报表数据"窗格把"Date"字段拖放到&

lintcode入门篇十六

1038. 珠宝和石头 中文English 给定字符串J代表是珠宝的石头类型,而S代表你拥有的石头.S中的每个字符都是你拥有的一个石头. 你想知道你的石头有多少是珠宝. J中的字母一定不同,J和S中的字符都是字母. 字母区分大小写,因此"a"和"A"是不同的类型. 样例 样例 1: 输入: J = "aA", S = "aAAbbbb" 输出: 3 样例 2: 输入: J = "z", S = "

lintcode入门篇一

1.反转一个只有3位数的整数. 样例 样例 1: 输入: number = 123 输出: 321 样例 2: 输入: number = 900 输出: 9 注意事项 你可以假设输入一定是一个只有三位数的整数,这个整数大于等于100,小于1000. class Solution: """ @param number: A 3-digit number. @return: Reversed number. """ def reverseIntege

lintcode入门篇三

一. 两数之和 给一个整数数组,找到两个数使得他们的和等于一个给定的数 target. 你需要实现的函数twoSum需要返回这两个数的下标, 并且第一个下标小于第二个下标.注意这里下标的范围是 0 到 n-1. 样例 Example1: 给出 numbers = [2, 7, 11, 15], target = 9, 返回 [0, 1]. Example2: 给出 numbers = [15, 2, 7, 11], target = 9, 返回 [1, 2]. 挑战 Either of the

lintcode入门篇二

一. 最大子数组 给定一个整数数组,找到一个具有最大和的子数组,返回其最大和. 样例 样例1: 输入:[−2,2,−3,4,−1,2,1,−5,3] 输出:6 解释:符合要求的子数组为[4,−1,2,1],其最大和为 6. 样例2: 输入:[1,2,3,4] 输出:10 解释:符合要求的子数组为[1,2,3,4],其最大和为 10. 挑战 要求时间复杂度为O(n) 注意事项 子数组最少包含一个数 输入测试数据 (每行一个参数)如何理解测试数据? 第一种解法:O(n)时间复杂度 class Sol

lintcode入门篇四

142. O(1)时间检测2的幂次 用 O(1) 时间检测整数 n 是否是 2 的幂次. 样例 Example 1: Input: 4 Output: true Example 2: Input: 5 Output: false 挑战 O(1) time 第一种方法:&的方法 class Solution: """ @param n: An integer @return: True or false """ ''' 1.使用递归的方法来

lintcode入门篇五

158. 两个字符串是变位词 写出一个函数 anagram(s, t) 判断两个字符串是否可以通过改变字母的顺序变成一样的字符串. 样例 样例 1: 输入: s = "ab", t = "ab" 输出: true 样例 2: 输入: s = "abcd", t = "dcba" 输出: true 样例 3: 输入: s = "ac", t = "ab" 输出: false 挑战 O(n)

lintcode入门篇七

211. 字符串置换 给定两个字符串,请设计一个方法来判定其中一个字符串是否为另一个字符串的置换. 置换的意思是,通过改变顺序可以使得两个字符串相等. 样例 Example 1: Input: "abcd", "bcad" Output: True Example 2: Input: "aac", "abc" Output: False class Solution: """ @param A:

lintcode入门篇十五

846. 多关键字排序 中文English 给定 n 个学生的学号(从 1 到 n 编号)以及他们的考试成绩,表示为(学号,考试成绩),请将这些学生按考试成绩降序排序,若考试成绩相同,则按学号升序排序. 样例 样例1 输入: array = [[2,50],[1,50],[3,100]] 输出: [[3,100],[1,50],[2,50]] 样例2 输入: array = [[2,50],[1,50],[3,50]] 输出: [[1,50],[2,50],[3,50]] class Solut