力扣刷题第三天--数组篇

前言

第三天,早八起来上课,脑子完全不在线,一道题也写不了,十点左右才开始动手写题,刷了两道题,感觉有点进步了,但态度有点懈怠,确实,诱惑很多,游戏,综艺,lol世界赛,环境影响...调整过来,珍惜时间

内容
一、删除有序数组中的重复项

26.删除有序数组中的重复项

给你一个 非严格递增排列 的数组 nums ,请你 原地 删除重复出现的元素,使每个元素 只出现一次 ,返回删除后数组的新长度。元素的 相对顺序 应该保持 一致 。然后返回 nums 中唯一元素的个数。

考虑 nums 的唯一元素的数量为 k ,你需要做以下事情确保你的题解可以被通过:

  • 更改数组 nums ,使 nums 的前 k 个元素包含唯一元素,并按照它们最初在 nums 中出现的顺序排列。nums 的其余元素与 nums 的大小不重要。
  • 返回 k 
暴力解法

遍历数组,找相邻两个数是否相等,如果相等就向前覆盖,并注意len--,i--

func removeDuplicates(nums []int) int {

length:=len(nums)
for i:=0;i<length-1;i++{
  if nums[i]==nums[i+1]{
   for j:=i;j<length-1;j++{
          nums[j]=nums[j+1]
   }
    
    length--
 i--
  }
    
}
return length
}
双指针法 

设快,慢两个指针,同时出发,fast和fast-1不等 fast赋值给slow,slow++,返回slow即可。

func removeDuplicates(nums []int)int{
   n:=len(nums)

   if n==0{
       return 0
   }

   slow:=1
 
   for fast:=1;fast<n;fast++{
       
        if nums[fast]!=nums[fast-1]{//slow fast是指针 if slow==fast没有意义  if nums[slow]==nums[fast] 元素是11122slow在1 fast在2 一直执行else 有多个2
nums[slow]=nums[fast]
            slow++
              //这里不用n--
        }
        
   }
   
    return slow
}

268ms 4.3MB 、、、8ms 4.2MB  效率可见一斑

二、搜索插入位置

35.搜索插入位置

给定一个排序数组和一个目标值,在数组中找到目标值,并返回其索引。如果目标值不存在于数组中,返回它将会被按顺序插入的位置。

请必须使用时间复杂度为 O(log n) 的算法。

暴力解法(一)

遍历数组 找到target返回索引 没有target 将其加入数组 然后排序 再次遍历返回索引 即插入的位置 4ms 2.77MB 它是正常的一步步解决问题 感觉太繁琐了 时间复杂度为O(n²),也没有达到要求

func searchInsert(nums []int, target int) int {
   
for i,m:=range nums{
    if m==target{
        return i
    }else{
        nums=append(nums,target)
        sort.Ints(nums)
        for j,v:=range nums{
            if v==target{
                return j
            }
        }
       }
}
return 0
}
 暴力解法(二)

思考:目的是返回什么 得时刻清楚 怎样得出这个返回值 不清楚这些,目的不明确,思维始终是乱的   这道题不管target在不在,都是要返回索引。索引可以在哪里出现,分别进行分析,无非是原数组前,数组中,能找到target和末尾。//4ms 2.77MB 代码量很少,关键是能想到这个思路。

func searchInsert(nums []int,target int)int{
    for i,v:=range nums{
        // 分别处理如下三种情况
        // 目标值在数组所有元素之前
        // 目标值等于数组中某一个元素  
        // 目标值插入数组中的位置
        if v>=target{ //注意这个等号
            return i
        }
    }
    // 目标值在数组所有元素之后的情况
    return len(nums)// 如果target是最大的,或者 nums为空,则返回nums的长度
}
二分法

题目要求了时间复杂度,我们可以想到二分法的时间复杂度是O(log n)。

分别处理如下四种情况:

目标值在数组所有元素之前  [0, -1]

目标值等于数组中某一个元素  return mid

目标值插入数组中的位置 [low,high],return  high + 1

 目标值在数组所有元素之后的情况 [low,high],因为是右闭区间,所以 return high + 1

//另外 如果是左闭右开区间 return也是不一样的

//0ms 2.77MB

func searchInsert(nums []int,target int)int{
    n:=len(nums)
   low,high:=0,n-1
   for low<=high{
       mid:=(high-low)>>1+low

      if target==nums[mid]{
             return mid
       } else if(target<nums[mid]){
            high=mid-1
       }else{
         low=mid+1
       }
       
   }
return high+1//之前写的n 改过来直接ac 说明什么 说明还是没懂要返回什么  
   
}

最后

最后,晚安~睡个好觉  哦对! 快周末了,到时候应该有时间更新新的栏目,增加任务量,考验一下自己吧!

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值