- 博客(4)
- 收藏
- 关注
原创 # 代码随想录 977. 有序数组的平方
我们不妨思考,将nums中每个数字都进行平方后,整个nums的大小分布应该像一个开口向上的二次函数一样,先递减,后递增 (负数部分递减, 正数部分递增)用i 和 j 两个指针对两端的数字进行比较,谁的平方大就放进去谁,然后再更新指针所指向的位置。原来的数组本身就是按照顺序排好的,需要返回一个由原来数字平方构成的新数组,这个新数组也要求按照飞递减顺序 排序好。此时的时间复杂度为O(n log n) 取决于sort()函数 ,通过本题的速度也是非常快的。双指针法的时间复杂度为O(n) ,空间复杂度为O(n)
2024-04-05 11:41:16
214
1
原创 #代码随想录 34. 在排序数组中查找元素的第一个和最后一个位置
大体与二分查找左闭右闭写法相同,只在最后一个else 部分(nums[middle] == target )做了一个小小的修改, 首先将first 赋值为 middle ,即假定当前的middle 就是第一次出现target的位置。注意,我们搜索的是“开始位置” 即“第一次出现1 的位置” ,搜索的对象不是“1” 而是“第一次出现的1”,这两个对象是不一样的,所以是满足二分查找的条件的。是不相悖的,题目要求我们找出开始位置和结束位置,那么我们可以分开来想,首先找到开始位置,再找到结束位置即可。
2024-04-05 11:25:43
229
1
原创 # 代码随想录 35.搜索插入位置
此时可以分析出,在left 左边的,一定是小于等于target 的部分,在right 右边的,一定是大于等于arget 的部分,这时整个数组就被left和right分割成了两半,所以如果target要按序插入进数组,就直接插入在left的位置就可以了!可以看到,退出while循环的条件是 left
2024-04-04 20:57:51
356
1
原创 #代码随想录 704 二分查找
同理 在更新left 的取值时 由于middle 本身已经包含在区间中, 已经判断过不符合题意了, 故middle + 1 即可 , 但在right 的更新中 , middle 并不包含在right区间里(因为是右开区间)所以在下一次更新中还要再次判断middle是否是目标值 所以使用 right = middle。举例: 第二种写法定义的是左闭右开区间 如 [ left ,right ) 若是小于等于 那么就存在left == right这样一种可能性 但实际上是不合法的。
2024-04-04 17:40:02
405
2
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅