前言
第三天,早八起来上课,脑子完全不在线,一道题也写不了,十点左右才开始动手写题,刷了两道题,感觉有点进步了,但态度有点懈怠,确实,诱惑很多,游戏,综艺,lol世界赛,环境影响...调整过来,珍惜时间
内容
一、删除有序数组中的重复项
给你一个 非严格递增排列 的数组 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 效率可见一斑
二、搜索插入位置
给定一个排序数组和一个目标值,在数组中找到目标值,并返回其索引。如果目标值不存在于数组中,返回它将会被按顺序插入的位置。
请必须使用时间复杂度为 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 说明什么 说明还是没懂要返回什么
}
最后
最后,晚安~睡个好觉 哦对! 快周末了,到时候应该有时间更新新的栏目,增加任务量,考验一下自己吧!