代码随想录day1| leetcode704. 二分查找,35.搜索插入位置 ,27. 移除元素,977.有序数组的平方

代码随想录day1

数组

《代码随想录》数组:数组理论基础

数组是存放在连续内存空间上的相同类型数据的集合。
image.png
需要两点注意的是

  • 数组下标都是从0开始的。
  • 数组内存空间的地址是连续的
    image.png
  • 那么二维数组在内存的空间地址是连续的么?
    c++是,java不是。
    image.png

《代码随想录》数组:二分查找

四号标题

题解经常出现的lowerBound是C++stl里的一种算法,返回第一个大于等于的下标。

704. 二分查找

这道题目的前提是数组为有序数组,同时题目还强调数组中无重复元素,因为一旦有重复元素,使用二分查找法返回的元素下标可能不是唯一的,这些都是使用二分法的前提条件.

int mid = left + ((right - left) >> 1);

的效果和

int mid = left + ((right - left) /2 );

一样,但是使用位运算通常比除法更快。
用左闭右开区间。注意要处理好边界,不然会超时。
如果说定义 target 是在一个在左闭右开的区间里,也就是[left, right) ,那么二分法的边界处理方式则截然不同。
有如下两点:

  • while (left < right),这里使用 < ,因为left == right在区间[left, right)是没有意义的
  • if (nums[middle] > target) right 更新为 middle,因为当前nums[middle]不等于target,去左区间继续寻找,而寻找区间是左闭右开区间,所以right更新为middle,即:下一个查询区间不会去比较nums[middle]
  • if (nums[middle] < target) left更新为middle+1,因为当前nums[middle]不等于target,然后去右区间找,所以left更新为middle+1,即:下一个查询区间也不会去比较nums[middle]
35.搜索插入位置

这个我最后是看[灵茶山艾府]看懂的,因为他有左闭右开的答案。
考虑这个插入的位置 pos,它成立的条件为:
nums[pos−1]<target<nums[pos]
其中 nums 代表排序数组。由于如果存在这个目标值,我们返回的索引也是 pos,因此我们可以将两个条件合并得出最后的目标:「在一个有序数组中找第一个大于 target 的下标」。
问题转化到这里,直接套用二分法即可,即不断用二分法逼近查找第一个大于 target 的下标 。
先把特判所有数都小于等于 target和所有数都大于 target的处理。
然后用二分查找,注意跳出while循环后,要返回right。

34. 在排序数组中查找元素的第一个和最后一个位置

看不懂

《代码随想录》数组:移除元素

四号标题

双指针法(快慢指针法): 通过一个快指针和慢指针在一个for循环下完成两个for循环的工作。
定义快慢指针

  • 快指针:寻找新数组的元素 ,新数组就是不含有目标元素的数组
  • 慢指针:指向更新 新数组下标的位置
27. 移除元素

注意,指针不是链表,指针移动只需要加一。
还有注意,是原地修改。
注意,你只需要返回k就可以。

《代码随想录》数组:有序数组的平方

977. 有序数组的平方

这里用双指针,分别从两头遍历到中间。然后比较大小,移动指针。直到两个指针重合。
注意,

nums[l] ** 2 

就是

nums[l] *nums[l]

还有int[] arr=new int[nums.length];
是new int [demension] 不能是new int [];

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值