今天是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
浙公網安備 33010602011771號