今天是day2,今天主要完成三个题目:求有序数组的平方,求长度最小的子数组,以及螺旋矩阵。
今日我仍然告诉自己,我是一个站在天才已有成果上进行不断重复作业并企图获得些许创新的庸才。
题目1:有序数组的平方,该题目要求我们将一个数组中的值全部平方并使其有序(降序),比较易想到的方法是,我们遍历原数组,将其中的值依次平方对比,再重新声明一个数组,将较大的数值依次放入,在遍历数组时使用前后双指针,用go实现:

func sortSquer(nums []int) []int {
    n:=len(nums)
    i,j,k:=0,n-1,n-1 //首尾以及新数组之下标
    ans:=make([]int,n)
    for i<=j {
        lm,rm:=nums[i]*nums[i],nums[j]*nums[j]
        if lm > rm{
            ans[k] = lm
            i++
        }else{
            ans[k] = rm
            j--
        }
        k--
    }
    return ans
}

用python实现如下:

def sortsquares(self,nums:List[int]) ->List[int]:
    i,j,k=0,len(nums)-1,len(nums)-1
    res = [float('inf')] * len(nums)
    while i<j :
        if nums[i] **2 < nums[j] **2:
            res[k] = nums[j] ** 2
            j-=1
        else:
            res[k] = nums[i] ** 2
            i+=1
        k-=1
    return res
        

对于python也可以使用库函数sort来实现一个暴力解法,即先全部平方数值再排序:

def sortSquares(self,nums:List[int]) ->List[int] :
    for i in range(len(nums)):
        nums[i]*=nums[i]
    nums.sort()
    return nums

题目二:寻找长度最小的子数组,该题目要求,在给定的数组中找到值相加为给定数值的元素并统计最小长度为几,这里使用滑动窗口法,即从数组头部开始,依次滑动将值相加,当大于目标值时调整位置并将头部值减去,继续滑动,这里需要注意调整的位置有一些讲究,起始点的i需要不断向前滑动,窗口的另一侧使用j-i+1随时调整,以下为go语言实现:

func miniArray(target int,nums []int) iny{
    i:=0
    sum:=0
    l:=len(nums)
    result :=l+1
    for j:=0;j<l;j++ {
        sum+=nums[j]
        for sum >= target{
            sublength:=j-i+1
            if sublength < result{
                result = sublength
            }
            sum-=nums[i]
            i++
        }
    }
    if result == l+1{
        return 0
    }else{
        return result
    }
}

以下为python实现:

def minSubarray(self,target:int,nums:List[int]) -> int:
    l = len(nums)
    right = 0
    left = 0
    min_len = float('inf')
    cur_sum = 0
    while right < l:
        cur_sum += nums[right]
        while cur_sum >= target:
            min_len = min(min_len,right-left+1)
            cur_sum-=nums[left]
            left+=1
        right+=1
    return min_len if min_len!= float('inf') else 0

题目三:螺旋矩阵,给定n的值,生成一个逆时针旋转的矩阵,实现方式不难想,从下到上,从左到右,从上到下,从右到左
以下为go语言实现:

func generateMatrix(n int) [][]int {
    top,bottom:=0,n-1
    left,right:=0,n-1
    num:=1
    tar:=n*n
    maritx:=make([][]int,n)
    for i:=0;i<n;i++{
        maritx[i] = make([i]int,n)
    }
    for num <= tar {
        for i:=left;i<=right;i++{
            maritx[top][i] = num
            num++
        }
        top++

        for i:=top;i<= bottom;i++{
            maritx[i][right] = num
            num++
        }
        right--
        for i:=right;i>= left;i--{
            maritx[bottom][i] = num
            num++
        }
        bottom--

        for i:=bottom;i>=top;i--{
            maritx[i][left] = num
            num++
        }
        left++
    }
    return maritx
}

python实现如下:

def generateMaritx(self,n:int)->List[List[int]]:
    if n<=0:
        return []
    maritx = [[0]*n for _ in range(n)]
    top,bottom,left,right = 0,n-1,0,n-1
    num = 1

    while top<= bottom and left <= right:
        for i in range(left,right+1):
            maritx[top][i] = num
            num+=1
        top+=1

        for i in range(top,bottom+1):
            maritx[i][right] = num
            num+=1
        right-=1

        for i in range(right,left-1,-1):
            maritx[bottom][i] = num
            num+=1
        botoom-=1
        for i in range(bottom,top-1,-1):
            maritx[i][left] = num
            num+=1
        left+=1
    return maritx