代码随想录day1|数组理论基础|704.二分查找|27.移除元素|Golang

目录

数组理论基础

 704.二分查找

27.移除元素

总结:


数组理论基础

        数组是存放在连续内存空间上的相同类型数据的集合。数组可以方便的通过下标索引的方式获取到下标下对应的数据。

        数组的下标从0开始 array[0].....arra[n],数组在内存中是连续的。

 704.二分查找

        给定一个 n 个元素有序的(升序)整型数组 nums 和一个目标值 target  ,写一个函数搜索 nums 中的 target,如果目标值存在返回下标,否则返回 -1。

思路1:暴力遍历:

        遍历整个nums,当nums[I] == target时候返回下标i。

func search(nums []int, target int) int {
    for i:=0;i<len(nums);i++{
        if nums[i] == target {
            return i
        }
    }
    return -1
}

思路2:二分查找

二分查找思想:

        1、每次查找都从区间[left....right]的中间查找。        

        2、如果查找的middle大于target则下一次要寻找的范围应该减小,即right = middle - 1。

        3、如果查找的middle小于target则下一次要寻找的范围要扩大,即left = mid + 1。

二分查找的条件:

        1、数组:数据根据下标可以以O(1)时间复杂度访问元素的值。       

        2、有序(特殊情况下可以无序)

func search(nums []int, target int) int {
    left, right := 0, len(nums)-1   //left为区间的第一个下标,right为区间的最后一个下标
    for left <= right {
        middle := left + (right - left) / 2
        // 也可以用middle = (left + right)/2,当数值变大时可能存在溢出风险
        if nums[middle] == target { // nums[middle] == target的时候
            return middle
        } else if nums[middle] > target {  // nums[middle] > target的时候
            right = middle - 1
        } else {    // nums[middle] < target的时候
            left = middle +  1
        }
    }
    return -1       //返回不存在的情况 
}

27.移除元素

        给你一个数组 nums 和一个值 val,你需要 原地 移除所有数值等于 val 的元素,并返回移除后数组的新长度。

        不要使用额外的数组空间,你必须仅使用 O(1) 额外空间并 原地 修改输入数组。元素的顺序可以改变。你不需要考虑数组中超出新长度后面的元素。

思路1:暴力循环

        第一层循环遍历,用来匹配到要求的val。

        第二层循环用来更新数组,用来将val之后的元素原地往前覆盖一位。这样就原地删除了val。

func removeElement(nums []int, val int) int {
    num_len := len(nums)
    for i:=0;i<num_len;i++{  //第一层遍历匹配要求的val
        if nums[i] == val {    
            for j:=i+1;j<len(nums);j++{    //第二层循环用来将val及其之后的元素往前移动一位
                nums[j-1] = nums[j] 
            }
            i--    //此时删除了一个元素了,i要--因为要和这次循环之后的++抵消啊。
            num_len--   //总的长度因为删除了一个元素所以也要--
        }
    }
    return num_len    //最终返回就可以了
}


时间复杂度:O(n^2)    //两重循环处理。
空间复杂度:O(1)    //只用了数组

思路2:双指针

        双指针的意思其实就是两个辅助的工具人。一个用于探究敌情,一个根据敌情做出行动。

开玩笑开玩笑,双指针我一般喜欢用fast(探究敌情)和slow(做出行动)。实际上fast是去遍历我们想要的东西或者不想要的东西,slow用于更新我们想要的val的数组下标值。

  • 快指针:寻找新数组的元素 ,新数组就是不含有目标元素的数组
  • 慢指针:指向更新 新数组下标的位置
func removeElement(nums []int, val int) int {
    slow := 0
    for fast:=0;fast<len(nums);fast++{
        if nums[fast] != val {
            nums[slow] = nums[fast]
            slow++
        } else if nums[fast] == val {    //这句话可以不用写的
            continue
        }
    }
    return slow
}

    时间复杂度:O(n)
    空间复杂度:O(1)

总结:

        本文讲解了二分查找的基本用法、快慢指针的基本用法。对应LeetCode704和LeetCode27。使用Go语言实现。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值