day1 | LeetCode704. 二分查找、LeetCode 27. 移除元素
创建时间: July 24, 2022 12:10 PM
一、今日任务
- 704.二分查找
- 26.移除元素
二、解体思路
704. 二分查找
数组基础:
解题二分查找前,要明确一个事情,数组在内存中是连续存储的,删除数组中某个位置的值,只是删除了这个位置上的值而已,原来值所在的位置是不会删除的,数组大小也不会发生改变。
解题思路:
要使用二分查找必须是一个顺序的数组,二分查找有几种写法,最常见的两种写法是,左闭右闭**[1,1]
,**左闭右开[1,1)
,需要弄清楚使用哪个种方式来写,弄清楚边界的问题。
常见的左闭右闭[1,1]
写法:
- 确定好边界
left
是有可能等于right
的,所以这里要写while(left <= right)
class Solution {
public int search(int[] nums, int target) {
int left = 0;
int right = nums.length - 1;
while(left <= right) {
int middle = left + (right-left) / 2;
if(nums[middle] == target){
return middle;
}else if(nums[middle] < target){
left = middle + 1;
}else if(nums[middle] > target) {
right = middle -1;
}
}
return -1;
}
}
左闭右开[1,1)
写法:
- 确定边界,
left != right
- left不可能等于right,所以这里要写
while(left <right)
class Solution {
public int search(int[] nums, int target) {
int left = 0;
int right = nums.length;
while(left < right) {
int middle = left + (right-left) / 2;
if(nums[middle] == target){
return middle;
}else if(nums[middle] < target){
left = middle + 1;
}else if(nums[middle] > target) {
right = middle;
}
}
return -1;
}
}
LeetCode 27. 移除元素
暴力解法:
暴力解法要花费两个循环去完成,第一个循环用于遍历整个数组,第二个循环在找到要移除的元素时会把后面的所有元素向前移动一位。
class Solution {
public int removeElement(int[] nums, int val) {
int size = nums.length;
for(int i = 0; i<size; i++){
if(nums[i] == val){
for(int j = i+1; j<size; j++){
nums[i] = nums[j];
}
i--;
size--;
}
}
return size;
}
}
双指针解法:
在看了视频后清晰了很多,主要弄清楚每个指针的作用是什么,其实两个指针都是在同一个数组上操作。
- fast 快指针用于遍历整个数组筛选出不需要删除的元素
- slow 慢指针代表的是新数组现在所在的位置
class Solution {
public int removeElement(int[] nums, int val) {
int slow = 0;
for(int fast = 0; fast< nums.length; fast++){
if(nums[fast] != val) {
nums[slow++] = nums[fast];
}
}
return slow;
}
}
三、今日收获
- 今日用时2小时
- 今天主要理解了二分法的核心就要清楚边界问题,清楚了快慢指针两个指针所代表的含义。