704 二分查找
题目
给定一个 n 个元素有序的(升序)整型数组 nums 和一个目标值 target ,写一个函数搜索 nums 中的 target,如果目标值存在返回下标,否则返回 -1。
第一想法
判断条件是 value = target
因为数组是升序,其实每种查找方法应该相差不大?
不过题目都标了二分查找了emmm
思路&题解
class Solution {
public int search(int[] nums, int target) {
// 左闭右闭的情况 左闭右开就暂时不想了,心累orz
// target和区间边界判断,肯定不在直接退出
if (target < nums[0] || target > nums[nums.length - 1]) {
return -1;
}
//边界
int left = 0, right = nums.length - 1;
// 停止条件:target和某一边界重合
// 闭区间是可以取到边界的所以是<=不是<
while (left <= right) {
//中间值
int mid = left + ((right - left) / 2);
if (nums[mid] == target){
return mid;
}
// 大于mid 落在右边 更新left
// 因为一开始考虑的是闭区间,所以要保证循环时即使改变范围也还是闭区间 所以有mid+1 和mid-1
else if (nums[mid] < target){
left = mid + 1;
}
// 小于mid 落在左边 更新right
else if (nums[mid] > target){
right = mid - 1;
}
}
return -1;
}
}
27 移除元素
题目
给你一个数组 nums 和一个值 val,你需要 原地 移除所有数值等于 val 的元素,并返回移除后数组的新长度。
不要使用额外的数组空间,你必须仅使用 O(1) 额外空间并 原地 修改输入数组。
元素的顺序可以改变。你不需要考虑数组中超出新长度后面的元素。
第一想法
O(1) 额外空间并 原地 修改输入数组==>意思是只有一个多余的空位可以考虑?
做了二分题目后第一反应是:用sort先排序,再二分查找,但是这题没说元素不重复...
卒
思路&题解
class Solution {
public int removeElement(int[] nums, int val) {
// 快慢指针 慢指针
int slowIndex = 0;
// 快指针 寻找新数组所需的元素
for (int fastIndex = 0; fastIndex < nums.length; fastIndex++) {
// 这一步真的...去掉=target的 其实就是留下≠target的,
// 如有target,slow留在原地,fast向前走,用不是target的后面的值来覆盖掉前面的target
if (nums[fastIndex] != val) {
nums[slowIndex] = nums[fastIndex];
slowIndex++;
}
}
return slowIndex;
}
}
文档讲解
https://www.programmercarl.com/0704.%E4%BA%8C%E5%88%86%E6%9F%A5%E6%89%BE.html
https://www.programmercarl.com/0027.%E7%A7%BB%E9%99%A4%E5%85%83%E7%B4%A0.html#%E7%AE%97%E6%B3%95%E5%85%AC%E5%BC%80%E8%AF%BE
视频讲解
https://www.bilibili.com/video/BV1fA4y1o715/?vd_source=cf378ec519f76396d006e5f8b80218db
https://www.bilibili.com/video/BV12A4y1Z7LP/?spm_id_from=333.788&vd_source=cf378ec519f76396d006e5f8b80218db
心得
其实参加训练营之前有练过一点点(从数组到字符串),但是这东西真的几天不复习就很难再想起来
而且口述思路看似简单,实际上写代码时才发现有很多细节是需要考虑的,之前面试写代码的时候发现数组的初始化都没法直接正确地写出来,基础还是不太牢,略痛苦
最近真的好多事啊,不过因为经历了这么多深刻明白一切只能靠自己,只有好好坚持下来才能达成自己的目的...
需要记忆的点:
(704)
1、有序、无重复数组用二分查找
2、首先判断target和区间边界
3、保证一开始是双闭区间的话,循环中改变边界也要是双闭区间,前后的两个区间不能重复包含某个边界值
(27)
1、首先把快慢指针法这种方法刻进DNA(到底怎么样才能想出这样的办法能不能给我看看你们的脑子
2、快指针用来 向前移动找值
3、慢指针用来 留在原地等覆盖
4、一起向前的时候,就意味着值是满足需求的,留着;不一起向前,就是要覆盖
附一个崩溃