赞
踩
leetcode 704题: 二分查找
题目链接: 704. 二分查找 - 力扣(LeetCode)
解题思路:
该数组是单调递增的,不断地通过比较区间的中间值nums[middlle] 和目标值target的大小,进而缩小区间的范围,
如果nums[middlle] 大于目标值target,区间的右边right = middlle-1 ;
如果nums[middlle] 小于目标值target,区间的左边 left=middlle-1 ;
按照这个逻辑,进行while循环.如果目标值存在返回下标,否则返回 -1
。
易错点:
while循环那里,left和right是否需要相等. 可以举一个特殊的例子进行辅助思考:
假设数组区间只剩下[4,5],而target=4,此时需要相等吗?
答案:
class Solution {
public int search(int[] nums, int target) {
int length = nums.length;
int left = 0;
int right = length - 1;
int middlle = (left + right) / 2;
while (left <= right) {
if (nums[middlle] == target) {
return middlle;
} else if (nums[middlle] > target) {
right = middlle-1 ;
} else if (nums[middlle] < target) {
left=middlle+1 ;
}
middlle = (left + right) / 2;
}
return -1;
}
}
leetcode 27题: 移除元素
题目链接: 27. 移除元素
解题思路:
申请一个变量int index ,用来记录 移除val后数组的新长度。
双指针法,左边指针不等于目标值val 的时候,左指针继续往右移动. index加一.
左边指针等于目标值val 的时候, 左指针和右指针交换值,把等于目标值val的值换到右指针对应的位置存放.
此时,最右边存放的就是目标值val,右边的指针需要左移. 注意,此时,左指针不右移,因为交换过后的左指针对应的值可能是目标值val.
易错点:
while 循环那里,left 和 right是否需要相等.
针对测试用例. [3,2,2,3] . 1号索引处的2 和3号索引处的3 进行交换后,此时,数组变成 [3,3,2,2]. 此时,左指针指向1号索引处的3, 右指针指向2号索引处的2( 右指针经历一次交换,左移了一份位置). 此时1号索引处的3是否等于目标值val还没有进行判断. 此时 left<right,还不能结束循环.
需要让left==right. 需要通过左指针判断2号索引处的值是否等于val值.
class Solution {
public int removeElement(int[] nums, int val) {
// index 用来记录 移除val后数组的新长度
int index = 0;
int left = 0;
int right = nums.length - 1;
while (left <= right) {
if (nums[left] == val) {
int temp = nums[left];
nums[left] = nums[right];
nums[right] = temp;
right--;
} else if (nums[left] != val) {
index++;
left++;
}
}
return index;
}
}
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。