【leetcode】※832. Flipping an Image

本文探讨了在Python中实现图像矩阵的翻转与元素值的反转算法,通过三种不同的方法实现了这一目标,并对比了它们的时间效率。文章还介绍了Python列表的高级用法以及位运算符的应用。

倒叙函数reverse()注意只是操作而已,返回none

本来想把if-else写成一行,结果出错不知道为啥

class Solution(object):
    def flipAndInvertImage(self, A):
        """
        :type A: List[List[int]]
        :rtype: List[List[int]]
        """
        for i,row in enumerate(A):
            row.reverse()
            for j,col in enumerate(row):
                if col==1:
                    A[i][j] = 0
                else:
                    A[i][j] = 1
        return A

81ms

居然因为case太少所以没有百分比系数

-----------------------

考虑了半天的与或者是亦或之类的逻辑用语直接把值给算出来而不是用if-else

看了人家写的真是妙啊。。1-A 就解决了,不过亦或确实可行A^1即可

而且还有一种倒着循环的方法

list的遍历还是不够熟练

list[a:b:c]  a表示开始的index,不包含index为b的元素结束(正序遍历则是b的前一个,倒序则是b的后一个停止),c为遍历方向(正为正序,负为倒序)以及步长(绝对值大小)

比如a = [0,1,2,3,4,5]

则a[3::-1] 为[3,2,1,0]

a[:3:-1] 为[5,4]

a[:2::-2]为[5,3]

class Solution(object):
    def flipAndInvertImage(self, A):
        """
        :type A: List[List[int]]
        :rtype: List[List[int]]
        """
        return [[1-i for i in row[::-1]]for row in A]

76ms

-------------------------------

真正的算法

  • 首先学习运算符~和^

~为按位取反运算符:对数据的每个二进制位取反,即把1变为0,把0变为1 。~x 类似于 -x-1

例如a = (0011 1100)二进制 = (60)十进制

~a = (1100 0011)二进制 = (-61)十进制    在一个有符号二进制数的补码形式

row[~i] = row[-i-1] = row[len(row) - 1 - i]就能倒着遍历

^为按位异或运算符:当两对应的二进位相异时,结果为1

  • 其次了解一下xrange和range

range返回列表,xrange返回生成器。除了这点差别其他无差异。要生成很大的数字序列的时候,用xrange会比range性能优很多,因为不需要一上来就开辟一块很大的内存空间。除非真的要生成一个list,否则在循环里用的时候都用xrange比较好。

最后了解一下算法

其实就是前后两个方向一起遍历,第一位的最后结果是最后一位的亦或;而最后一位最后的结果则是第一位的亦或。

这样loop的时候节省一半时间。

class Solution(object):
    def flipAndInvertImage(self, A):
        """
        :type A: List[List[int]]
        :rtype: List[List[int]]
        """
        for row in A:
            for i in xrange((len(row)+1)/2):
                row[i],row[~i] = row[~i]^1,row[i]^1
        return A

59ms 时间复杂度为N,其中N为A中所有元素的个数 空间复杂度为1



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值