给你一个按 非递减顺序 排序的整数数组 nums,返回 每个数字的平方 组成的新数组,要求也按 非递减顺序 排序。
示例 1:
- 输入:nums = [-4,-1,0,3,10]
- 输出:[0,1,9,16,100]
看到题目的第一思路,1.遍历每个数给每个数加个平方, 2再遍历一遍数据,给每个数按照从小到大的顺序进行排序(快排)。
难点一:怎么给每个数取平方,难点二:怎么用时复杂度为n的平方的排序
这是暴力破除,暂时不考虑
class Solution:
def sortedSquares(self,nums:List[int])->List[int]:
l,r,i = 0,len(nums)-1,len(nums)-1# l表示输入列表的头,r表示输入列表的尾,i表示新的列表的尾
res = [float('inf')] * len(nums)
while(l<=r):
if nums[r]**2>nums[l]**2:
res[i] = nums[r]**2
r-=1
else:
res[i]=nums[l]**2
l+=1
i=i-1
return res
这是自己参考代码随想录写的双指针思路
此外,res = [float('inf')] * len(nums), float("inf")表示列表的每个元素都是无穷大
给定一个含有 n
个正整数的数组和一个正整数 target
。
找出该数组中满足其总和大于等于 target
的长度最小的 连续子数组 [numsl, numsl+1, ..., numsr-1, numsr]
,并返回其长度。如果不存在符合条件的子数组,返回 0
。
1暴力解法,时间复杂度为O(n2)
(版本二)暴力法
class Solution:
def minSubArrayLen(self, s: int, nums: List[int]) -> int:
l = len(nums)
min_len = float('inf')
for i in range(l):
cur_sum = 0
for j in range(i, l):
cur_sum += nums[j]
if cur_sum >= s:
min_len = min(min_len, j - i + 1)
break
return min_len if min_len != float('inf') else 0
#下面是针对暴力解法的解释:
l=len(nums)#定义数组的长度
min_len = float('inf')#最小长度是一个无穷大的正数
for i in range(l):#第一层循环,定下连续数组的起始位置
cur_sum = 0#连续子数组的和每次都要置0
for j in range(i,l)#第二层循环,索引为第一个索引后面,决定索引的终止位置
cur_sum +=nums[j]#将所有可能的连续数组和的值算出来相加
if cur_sum>target:#如果和大于target
min_len = min(min_len,j-i+1)#从里面找出最小的长度
break#如果找到了跳出循环
return min_len if min_len !=float('inf') else 0#找到返回其长度,没找到,返回0
2.双指针解法:
class Solution:
def minSubArrayLen(self, target: int, nums: List[int]) -> int:
left = 0
right = 0
min_len = float('inf')
cur_sum = 0#当前的累加值
l = len(nums)#数组的长度
while right<l:#连续子数组的右边小于nums的长度
cur_sum += nums[right]#连续子数组的总和
while cur_sum >= target:#当总和大于目标时
min_len = min(min_len,right-left+1)#取符合总和大于target的连续子数组
cur_sum -=nums[left]#总和减去左边的索引对应的值
left+=1#左边索引向右移动一格
right +=1#右索引向右移动一格
return min_len if min_len != float('inf') else 0