977.有序数组的平方
开始之前先记录一下python和java语法的区别:
for循环
for(int i = 0; i <= len(nums); i++)
squnums[i] = nums[i]*nums[i]
<====>
python里是这样写的
nums = [1, 2, 3, 4, 5]
squnums = []
for i in range(len(nums)):
squnums.append(nums[i] * nums[i])
print(squnums)
在这个示例中,我们使用range(len(nums))
来生成索引的范围,然后通过nums[i] * nums[i]
计算每个元素的平方,并将结果添加到squnums
列表中。最后,我们使用print
语句来输出squnums
列表的内容。注意Python中的列表索引从0开始,所以不需要使用<=
,而只需要使用<
。
ps:python不用申明变量、、、sos这么简单的吗,,好吧!
自己做的暴力解法:(会超时)
nums=[-4,-1,0,3,10]
squnums = []
### 想的是先平方,后排序(暴力解法)
#1、先平方
for i in range(len(nums)):
squnums.append(nums[i]*nums[i])
print(squnums)
#2、后排序
for i in range(len(squnums)):
for n in range(len(squnums)):
if (squnums[i]<squnums[n]):
#int temp
temp = squnums[i]
squnums[i] = squnums[n]
squnums[n] = temp
print("排序后")
print(squnums)
时间复杂度为O(n)+O(nlogn) 【你用的排序方法的复杂度】
双指针法:
使用双指针法的重点是这道题目是有序的,给你一个按 非递减顺序 排序的整数数组 nums
,返回 每个数字的平方 组成的新数组,要求也按 非递减顺序 排序。
既然有序,说明可以从头和尾巴开始一一对比。
nums=[-4,-1,0,3,10]
squnums = [0] * len(nums)
k = len(nums) - 1 #注意⚠️这里也容易错,是0开始所以要-1
#双指针法
i = 0
j = len(nums) - 1
while(i!=j):#没有考虑到i = j 的情况; 正确:i〈=j
if nums[i]*nums[i] > nums[j]*nums[j]:
squnums[k] = nums[i]*nums[i]
i += 1
else:
squnums[k] = nums[j]*nums[j]
j -=1
k -= 1
print(squnums)
滑动窗口法:用一个for循环来做两个for循环所做的事情
重点 1)
for( j <---这个j很重要,到底表示的是起始位置呢还是终止位置?
重点 2)
判断条件 if / while sum > s
target = 7
nums = [2,3,1,2,4,3]
#例子
i = 0
sum = 0
result = 10000000 #这里要取一个最大值
flag = False
for j in range(len(nums)):
sum = sum + nums[j]
while sum >= target:
subL = j - i + 1
#更新值 这里有点没明白
result = min(result,subL)
#最终值j向后移动一位后,i向前移动,这时sum应该剪去之前的值
sum = sum - nums[i]
i+=1
flag = True
if flag == True:
return result
else:
return 0
先放这里,有点没懂,后面再补