数组这块需要理解连续内存地址与变量的指引关系,下标的操作和不同语言里的关于数组的built-in函数。
原理参考Carl哥的数组讲解:programmercarl.com/%E6%95%B0%E…
- leetcode 704 二分查找 easy
题目链接: leetcode.com/problems/bi…
思路: 目标值比较下标在中间的位置的值,操作左右下标改变搜索范围锁定目标值位置。
代码:
class Solution {
public int search(int[] nums, int target) {
int left = 0;
int right = nums.length - 1;
while (left <= right) {
int mid = (right - left) / 2 + left;
if (target > nums[mid]) {
left = mid + 1;
} else if (target < nums[mid]) {
right = mid - 1;
} else {
return mid;
}
}
return -1;
}
}
提交报错 (1):
第1次: 数组只有1个元素时需要考虑清楚边界条件,左右下标比较需要等于。
- leetcode 27 移除元素 easy
题目链接: leetcode.com/problems/re…
思路: 双指针类型的经典快慢指针,策略是快指针先走,遍历寻找目标删除值。没遇到则快指针位置值给慢指针位置值,遇到则快指针单走慢指针不动。
代码:
class Solution {
public int removeElement(int[] nums, int val) {
int slow = 0;
for (int fast = 0; fast < nums.length; fast++) {
if (nums[fast] == val) {
continue;
} else {
nums[slow++] = nums[fast];
}
}
return slow;
}
}
- leetcode 35 Search Insert Position easy
题目链接: leetcode.com/problems/se…
思路: 二分查找的变型,有区别的地方在没有找到的情况需要输出该插入位置的下标,这种情况属于最后一次比较时,是目标值比当前mid节点大的情况。left在没找到的情况刚好走到mid的下一个位置进不去while循环。
代码:
class Solution {
public int searchInsert(int[] nums, int target) {
int left = 0;
int right = nums.length - 1;
while(left <= right) {
int mid = left + (right - left) / 2;
if (target > nums[mid]) {
left = mid + 1;
} else if (target < nums[mid]) {
right = mid - 1;
} else {
return mid;
}
}
return left;
}
}