算法通关村第三关青铜挑战——爱不起的数组

初始化

本质:用需要的值覆盖已有的值

必须从前向后连续空间初始化,不可以出现空缺情况

基本操作

创建与初始化

#创建
list=[]

初始化,没看懂

查找一个元素

根据值是否相等进行线性查找

def findByElement(arr,size,key):
    for i in range(size):
        if arr[i]==key:
            return i
    return -1

作业,数组递增时

def findByElement(arr,size,key):
    for i in range(size):
        if arr[i]>=key:
            return arr[i]
    return -1

增加一个元素(重要)

在有序数列中将给定元素插入到对应位置shan

def addByElenmentSequence(arr,size,element):
    if size>=len(arr):
        return -1
    index=size

    for i in range(size):
        if element<arr[i]:
            index=i
            break

    for j in range(size,index,-1):
        arr[i]=arr[j-1]

    arr[index]=element

    return index

删除一个元素

先从最左侧开始查是否存在元素,如果元素存在,从该位置开始执行删除操作。

def removeByElement(arr,size,key):
    index=-1

    for i in range(size):
        if arr[i]==key:
            index=i
            break

    if index!=-1:
        for i in range(index,size-1):
            arr[i]=arr[i+1]
        size=size-1

    return size

 算法热身

单调数组问题

想法是两个分开看,并做了一个标记位

def isMonotonic(self, nums):
    l= len(nums)
    count = 0
    for i in range(l - 1):
        if nums[i] > nums[i + 1]:
            count = 1
            break

    if count == 1:
        for i in range(l - 1):
            if nums[i] < nums[i + 1]:
                count = 2
                break

    if count == 2:
        return False
    else:
        return True

改进——看了老师的,做了标志位改进,这样只用一个循环就可以测两个了

def isMonotonic(self, nums):
    l= len(nums)
    inc=True
    dec=True
    for i in range(l - 1):
        if nums[i]>nums[i+1]:
            dec=False
        if nums[i]<nums[i+1]:
            inc=False
    return inc or dec

拓展——leetcode35

记得补充二分

def searchInsert(self, nums, target):
    n = len(nums)
    index = n
    for i in range(n):
        if nums[i] == target:
            return i
        if nums[i] > target:
            index = i
            break
    return index

数组合并

这道题对我还是很困难

首先第一种思路,我认为是创建一个新数组,然后把他们对比再放进去,这个比较简单

第二种思路,把nums2数组合并到nums1数组里面去,从前往后

难点:数组后移代码写不出来,回去看了老师的增加元素,使用了从后往前移的方法,你能直接后移吗?

def merge(self, nums1, m, nums2, n):
    i = j = 0
    tmp = 0
    while i < m:
        if j < n and nums1[i] > nums2[j]:
            #这段循环很重要,背下来,数组从后往前移,因为我写不来数组直接后移
            for k in range(m, i, -1):
                nums1[k] = nums1[k - 1]
            nums1[i] = nums2[j]
            m += 1
            j += 1
        i += 1
    while j < n:
        nums1[i] = nums2[j]
        i += 1
        j += 1

第三种思路,先将nums2合并到nums1数组后面,再对nums1数组进行排序,开拓思路

优化——从后向前插入

def merge(self, nums1, m, nums2, n):
    i=m+n-1
    m-=1
    n-=1
    while m>=0 and n>=0:
        if nums1[m]>nums2[n]:
            nums1[i]=nums1[m]
            m-=1
        else:
            nums1[i] = nums2[n]
            n -= 1
        i-=1
    #对老师的方法进行了改进,因为发现nums1数组即使没遍历完也没影响,省略了判断他的这一步
    while n!=-1:
        nums1[i]=nums2[n]
        n-=1
        i-=1

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值