LeetCode 704 二分查找
题目链接 704 二分查找
文章讲解链接 代码随想录
视频讲解链接 https://www.bilibili.com/video/BV1fA4y1o715
自己写的代码:
class Solution {
public int search(int[] nums, int target) {
int left = 0;
int right = nums.length-1;//定义了target在左闭右闭的区间里;如果是nums.length,则是左闭右开的区间
// if(target < nums[left] || target > nums[right]){
// return -1;
// }
while(left <= right){
int mid = left + (right - left ) / 2; // 防止溢出 等同于(left + right)/2
if(nums[mid] > target){
right = mid -1;
}
else if(nums[mid] < target){
left = mid + 1;
}else{
return mid;
}
}
return -1;
}
}
该题注意点:
①:左闭右闭区间的时候,while(left<=right),可以取left = right,可举例解释[1,1]是合法区间;
左闭右开的时候,while(left<right),[1,1)是不合法区间。
② 左闭右闭时,if(nums[mid] > target) right = mid -1 ;因为不存在重复的值,所有mid索引对应的值不会等于target;若right = mid ,由于已经判断出mid > target了,再把不是自己搜索区间的值又放到下一个循环,就会有问题了。
题解的代码:
class Solution {
public int search(int[] nums, int target) {
// 避免当 target 小于nums[0] nums[nums.length - 1]时多次循环运算
if (target < nums[0] || target > nums[nums.length - 1]) {
return -1;
}
int left = 0, right = nums.length - 1;
while (left <= right) {
int mid = left + ((right - left) >> 1);
if (nums[mid] == target)
return mid;
else if (nums[mid] < target)
left = mid + 1;
else if (nums[mid] > target)
right = mid - 1;
}
return -1;
}
}
写代码时遇到的问题:
① 应当考虑到target小于0索引和最大索引时的情况;
② mid的赋值运算声明应当在while循环内;
③ 为了防止int型溢出,使用left+(right-left)/ 2,等同于使用(left+right)/ 2。
LeetCode 27 移除元素
题目链接 27 移除元素
文章讲解 代码随想录
视频讲解 https://www.bilibili.com/video/BV12A4y1Z7LP
该题思路:如果fast指针的值不等于val的值,则slow指针会停止不动,不会再做自增的操作,而fast指针还会因for循环进行自增的操作,这样就会形成一个错位的fast指针对slow指针的赋值,这样可以避开数组中等于val的值,继而用下一个值去覆盖数组中等于val的值。
数组中的删除操作实际上是后面元素往前覆盖的操作。
自己写的代码:
class Solution {
public int removeElement(int[] nums, int val) {
int slow = 0; //slow,fast都代表数组的索引
for(int fast=0; fast < nums.length; fast++){
if(nums[fast] != val){
nums[slow] = nums[fast];
slow++;
}
}
return slow; //返回数值是整数,输出的答案是数组
}
}
题解的代码:
class Solution {
public int removeElement(int[] nums, int val) {
// 快慢指针
int slowIndex = 0;
for (int fastIndex = 0; fastIndex < nums.length; fastIndex++) {
if (nums[fastIndex] != val) {
nums[slowIndex] = nums[fastIndex];
slowIndex++;
}
}
return slowIndex;
}
}
写代码时遇到的问题:该题理解起来较容易,代码也简洁,没遇到问题。
今日学习时长:3小时。