代码随想录算法训练营第一天|LeetCode704 二分查找,LeetCode 27 移除元素,LeetCode 977 有序数组的平方

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。希望能坚持到最后!!!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值