数组--中心索引,插入位置,合并区间,旋转,零矩阵,对角线遍历

发布于:2023-01-18 ⋅ 阅读:(126) ⋅ 点赞:(0)

目录

1.寻找数组的中心索引

2.搜索插入位置

3.合并区间

4.旋转(还有问题)

5.零矩阵

6.对角线遍历


1.寻找数组的中心索引

给你一个整数数组 nums ,请计算数组的 中心下标 。

数组 中心下标 是数组的一个下标,其左侧所有元素相加的和等于右侧所有元素相加的和。

如果中心下标位于数组最左端,那么左侧数之和视为 0 ,因为在下标的左侧不存在元素。这一点对于中心下标位于数组最右端同样适用。

如果数组有多个中心下标,应该返回 最靠近左边 的那一个。如果数组不存在中心下标,返回 -1

class Solution(object):
    def pivotIndex(self, nums):
        n=len(nums)
        sums = sum(nums)
        if sums-nums[0]==0:
            return 0
        flag=n1=n2=0
        for i in range(1,n):
            n1+=nums[i-1]
            n2=sums-n1-nums[i]
            
            if n1==n2:
                flag=1
                return i
        if flag==0:
            return -1

2.搜索插入位置

给定一个排序数组和一个目标值,在数组中找到目标值,并返回其索引。如果目标值不存在于数组中,返回它将会被按顺序插入的位置。

请必须使用时间复杂度为 O(log n) 的算法。

class Solution(object):
    def searchInsert(self, nums, target):
        n=len(nums)
        y=[0]*n
        if target-nums[n-1]>0:
            return n
        for i in range(n):
            y[i]=target-nums[i]
            if y[i]<=0:
                return i

因为给定的是一个排序数组,所以可以使用二分法查找

class Solution(object):
    def searchInsert(self, nums, target):
        left=0
        n=len(nums)
        right = n-1
        while (left<=right):
            mid = left+(right-left)//2 
            if nums[mid]==target:
                return mid
            elif nums[mid]<target:
                left=mid+1
            else:
                right=mid-1
        return right+1

3.合并区间

以数组 intervals 表示若干个区间的集合,其中单个区间为 intervals[i] = [starti, endi] 。请你合并所有重叠的区间,并返回 一个不重叠的区间数组,该数组需恰好覆盖输入中的所有区间 。

输入[[1,3],[2,6],[8,10],[15,18]]------intervals

输出[[1,6],[8,10],[15,18]]-----merges

新建一个列表merges,遍历intervals,判断merges最后一个元素与intervals首元素大小关系,若后者大,直接append到列表中,若前者大,则将两个区间合并(取最大值作为合并列表的最后一个元素)。

class Solution(object):
    def merge(self, intervals):
        intervals.sort(key=lambda x : x[0])
        merges=list()
        for inte in intervals:
            if not merges or merges[-1][-1] < inte[0]:
                merges.append(inte)
            else:
                merges[-1][-1]=max(merges[-1][-1],inte[1])
        return merges

4.旋转(还有问题)

给你一幅由 N × N 矩阵表示的图像,其中每个像素的大小为 4 字节。请你设计一种算法,将图像旋转 90 度。

不占用额外内存空间能否做到?

class Solution(object):
    def rotate(self, matrix):
        x=len(matrix)
        # m1=matrix#[[0]*(x)]*x
        # 对角线翻转
        for i in range(x):
            for j in range(i+1,x):
                matrix[i][j],matrix[j][i]=matrix[j][i],matrix[i][j]
                # m1[i][j]=matrix[x-1-j][i]
        # 水平翻转
        for i in range(x):
            for j in range(x/2):
                matrix[i][j],matrix[i][x - j - 1] = matrix[i][x - j - 1],matrix[i][j]
        # 下标操作还没有实现,题目中说了不能占用额外空间,这里使用m1,但m1=matrix算是占用额外空间吗?
        # for i in range(x):
        #     for j in range(i+1,x):
        #         m1[i][j]=matrix[x-1-j][i]
        return matrix

5.零矩阵

编写一种算法,若M × N矩阵中某个元素为0,则将其所在的行与列清零。

        不需要清楚的知道下标位置,只需要将下表所在的行或者列清零。

class Solution(object):
    def setZeroes(self, matrix):
        n=len(matrix)#考虑到矩阵不一定是行数=列数
        m=len(matrix[0])
        row=[0]*m
        col=[0]*n
        #先找到值为0的下表,存入row和col
        for i in range(n):
            for j in range(m):
                if matrix[i][j]==0:
                    row[j]=1
                    col[i]=1
        #将下标所在的行和列清零
        for i in range(n):
            for j in range(m):
                if row[j]==1 or col[i]==1:
                    matrix[i][j]=0
        return matrix

6.对角线遍历

给你一个大小为 m x n 的矩阵 mat ,请以对角线遍历的顺序,用一个数组返回这个矩阵中的所有元素。

 

细节:设置上下界限,需要遍历的对角线条数,用到了for、while、if循环

class Solution(object):
    def findDiagonalOrder(self, mat):
        m=len(mat)  
        n=len(mat[0])
        k=m+n-1
        lis=[]
        row,col=0,0
        for i in range(k):
            if i%2==0:   #偶数对角线,向右上遍历
                while row>=0 and col<n:

                    lis.append(mat[row][col])
                    row-=1#向上
                    col+=1#向右
                if col<n:     #这时超出了上边界,需要移动到左下角
                    row+=1
                else:    #col<n,这时row<0了
                    row+=2
                    col-=1
            else:   #奇数对角线
                while col>=0 and row<m:
                    lis.append(mat[row][col])
                    row+=1
                    col-=1
                if row<m:    #这时超出了下边界,需要移动到右上角
                    col+=1
                else:
                    row-=1
                    col+=2
        return lis


网站公告

今日签到

点亮在社区的每一天
去签到