leetcode 2

python数组

1.数组

1.1数组基础知识

数组(Array):一种线性表数据结构。它使用一组连续的内存空间,来存储一组具有相同类型的数据。
在这里插入图片描述
数组的基本操作:
访问元素

# 从数组 nums 中读取下标为 i 的数据元素值
def value(nums, i):
	if 0 <= i <= len(nums) - 1:
		print(nums[i])
		
arr = [0, 5, 2, 3, 7, 1, 6]
value(arr, 3)

查找元素

# 从数组 nums 中查找元素值为 val 的数据元素第一次出现的位置
def find(nums, val):
    for i in range(len(nums)):
        if nums[i] == val:
            return i
    return -1

arr = [0, 5, 2, 3, 7, 1, 6]
print(find(arr, 5))

插入元素
(在数组尾部插入值为 val 的元素)

arr = [0, 5, 2, 3, 7, 1, 6]
val = 4
arr.append(val)
print(arr)

(在数组第 i 个位置上插入值为 val 的元素)

arr = [0, 5, 2, 3, 7, 1, 6]
i, val = 2, 4
arr.insert(i, val)
print(arr)

改变元素

def change(nums, i, val):
    if 0 <= i <= len(nums) - 1:
        nums[i] = val
        
arr = [0, 5, 2, 3, 7, 1, 6]
i, val = 2, 4
change(arr, i, val)
print(arr)

删除元素
(删除数组尾部元素)

arr = [0, 5, 2, 3, 7, 1, 6]
arr.pop()
print(arr)

(删除数组第 i 个位置上的元素)

arr = [0, 5, 2, 3, 7, 1, 6]
i = 3
arr.pop(i)
print(arr)

(基于条件删除元素)

arr = [0, 5, 2, 3, 7, 1, 6]
i = 3
arr.remove(5)
print(arr)

在这里插入图片描述
思路:我自己思路和思路二相似,但是没有想到,需要多次便利,才能遍历所有元素。参见思路二

  1. 在这里插入图片描述
  2. 如图所示,1->3、3->5、5->1是一个轮回,2->4、4->6、6->2是第二个轮回,两个轮回可以原地完成对数组的轮转。问题在于需要轮转几次,每次轮转何时结束。
  3. 每次轮转何时结束:当重新回到本轮回第一个元素是结束,也就是第一个轮回到1,第二个轮回到2时结束。
  4. 需要轮转几回(走了整数数量的圈):因为从 0 开始不断遍历,最终又回到起点 0,这个过程走了a圈(a正为整数),每圈的长度为n。 这个过程中,走的每一步的长度为k,共走过了b个元素,所以走的总步长为bk,也即这a圈的长度,即an=bk。 即 an 一定为 n,k 的公倍数。又因为我们在第一次回到起点时就要结束,因此a要最小,故an就是n,k的最小公倍数lcm(n,k) , 因此 b 就为lcm(n,k)/k,这说明从起点再次回到起点的过程中会访问到 lcm(n,k)/k 个元素。 为了访问到所有的元素,我们需要进行遍历的次数为,n/lcm(n,k)/k = n*k/lcm(n,k) = gcd(n,k)(最大公约数和最小公倍数的关系) 即需要遍历的次数为n和k的最大公约数。

答案:

from typing import List

class Solution:
    def rotate(self, nums: List[int], k: int) -> None:
        """
        Do not return anything, modify nums in-place instead.
        """
        n = len(nums)
        k = k % n
        count = self.gcd(k, n)
        for i in range(count):
            start = i
            pre = nums[i+k]
            nums[i+k] = nums[i]
            i = (i+k)%n
            while  i != start:
                rear = nums[ (i+k) % n ]
                nums[(i+k) % n] = pre
                pre = rear
                i = (i+k)%n
        print(nums)

    def gcd(self,a, b):
        if(b==0):
            return a 
        else:
            return self.gcd(b,a%b) 

if __name__ == '__main__':
    a = Solution()
    nums = [-1,-100,3,99]
    k = 2
    a.rotate(nums, k)

# https://www.cnblogs.com/easonbook/p/12876402.html 关于List报错的解决

在这里插入图片描述
思路参考:思路二
通过推导得到在这里插入图片描述

答案:

from typing import List

class Solution:
    def rotate(self, matrix: List[List[int]]) -> None:
        """
        Do not return anything, modify matrix in-place instead.
        """
        n = len(matrix)
        for i in range(n//2):
            for j in range( (n+1) // 2):
                temp = matrix[i][j]
                matrix[i][j] = matrix[n-j-1][i]
                matrix[n-j-1][i] = matrix[n-i-1][n-j-1]
                matrix[n-i-1][n-j-1] = matrix[j][n-i-1]
                matrix[j][n-i-1] = temp
        
        print(matrix)


if __name__ == '__main__':
    matrix = [[1,2,3],[4,5,6],[7,8,9]]
    a = Solution()
    a.rotate(matrix)
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值