1.LeetCode 704 二分查找
题目链接:704.二分查找
先尝试一下,没用什么方法乱写的
nums = [-1,0,3,5];target = 9
def search(nums,target):
a = -1
for i in nums:
a += 1
if i == target:
return a
elif a+1 == len(nums):
return -1
print(search(nums,target))
运行了一下发现还不错,但是会不会太简单了点。
接着去搜索了一下二分查找,感觉发现了新大陆
用二分查找写的代码
nums = [-1,0,3,5,9,12,13,14,15];target = 9
def search(nums,target):
left = 0;right = len(nums) - 1
while left < right:
middle = (left + right) // 2
if nums[middle] < target:
left = middle + 1
elif nums[middle] > target:
right = middle - 1
else:
return middle
return -1
print(search(nums,target))
感觉还可以
看完讲解视频后,发现问题了
这个代码既有左闭右闭,也有左闭右开
修改一下
nums = [-1,0,3,5,9,12,13,14,15];target = 9
def search(nums,target):
left = 0;right = len(nums) - 1
while left < right:
middle = (left + right) // 2
if nums[middle] < target:
left = middle + 1
elif nums[middle] > target:
right = middle
else:
return middle
return -1
print(search(nums,target))
这样就好啦!!(应该是左闭右开)
那再写写另一种
nums = [-1,0,3,5,9,12,13,14,15];target = 9
def search(nums, target):
left = 0;right = len(nums) - 1
while left <= right:
middle = (left + right) // 2
if nums[middle] > target:
right = middle - 1
elif nums[middle] < target:
left = middle + 1
else:
return middle
return -1
print(search(nums, target))
这是左闭右闭
第一题结束
2.LeetCode 27 移除元素
题目链接:27.移除元素
还是一样,先尝试
nums = [0,1,2,2]; val = 2
k = 0
for i in range(len(nums)):
if nums[i] == val:
nums[i] = '_'
else:
k += 1
numsInt = [];numsStr = []
for j in nums:
if type(j) == int:
numsInt.append(j)
elif type(j) == str:
numsStr.append(j)
print(k, numsInt + numsStr)
写是写出来了,但是感觉不太对。看看视频怎么说的
尝试一下暴力的方法
nums = [0,1,2,2]; val = 2
k = 0;a = 0;size = len(nums)
for i in range(len(nums)):
if nums[a] == val:
for j in range(a, len(nums)-1):
nums[j] = nums[j+1]
k += 1
a -= 1
size -= 1
a += 1
print(len(nums) - k, nums[0: size])
好像没有什么问题。再看看双指针怎么写
nums = [3,2,2,3]; val = 3
k = 0;slow = 0;fast = 0
for i in range(len(nums)):
if nums[fast] != val:
nums[slow] = nums[fast]
slow += 1
k += 1
fast += 1
print(k,nums[0:k])
说实话有点难理解
第二题结束
3.LeetCode 977 有序数组的平方
题目链接:977.有序数组的平方
先尝试双指针法(直接用sort排序的方法我就不写了,太简单了)
很遗憾,没思路,看看视频怎么说
nums = [-5,-4,-3,0,1,2,3,14];nums2 = [0 for i in range(len(nums))]
i = 0;j = len(nums) - 1;k = len(nums) - 1
while i <= j:
if nums[i] ** 2 < nums[j] **2 :
nums2[k] = nums[j] ** 2
j -= 1;k -= 1
else:
nums2[k] = nums[i] ** 2
k -= 1;i += 1
print(nums2)
看了视频之后写的,感觉不算难,就是“从两边开始比较”这一思路有点难想到
第三题结束
总结:
今天是算法训练营的第一天,题目难度不算大,用时3.5h。希望能坚持到最后!!!