目录
LeetCode 704.二分查找
题目链接:704. 二分查找 - 力扣(LeetCode)
解题思路:对于一个有序数组来讲,可以利用二分查找来查找数组中某一个元素,此方法又可以分为两个具体的思路(左闭右闭和左闭右开)。
遇到的问题:Java中的浮点数溢出问题以及对位运算不太熟悉。
代码实现:
左闭右闭:
class Solution {
public int search(int[] nums, int target) {
//首先要确定target是在数组nums的大小范围中,否则查找将失去意义
if(target<nums[0]||target>nums[nums.length-1])
return -1;
int left = 0;
int right = nums.length-1;
while(right>=left)
{
int mid = left+((right-left)>>1);
if(nums[mid]>target){
right = mid-1;
}else if(nums[mid]<target){
left = mid+1;
}else if(nums[mid]==target)
return mid;
}
return -1;
}
}
左闭右开:
class Solution {
public int search(int[] nums, int target) {
//首先要确定target是在数组nums的大小范围中,否则查找将失去意义
if(target<nums[0]||target>nums[nums.length-1])
return -1;
int left = 0;
int right = nums.length;
while(right>left)
{
int mid = left+((right-left)>>1);
if(nums[mid]>target){
right = mid;
}else if(nums[mid]<target){
left = mid+1;
}else if(nums[mid]==target)
return mid;
}
return -1;
}
}
总结:
要熟悉的掌握这两种方法,两种方法中mid的选取是不同的。
LeetCode 27.移除元素
遇到的问题:
对于双指针的操作不够熟练。
代码实现:
class Solution {
public int removeElement(int[] nums, int val) {
int left = 0;
int right = nums.length-1;
while(right >= 0 && nums[right] == val)
right--;
while(left <= right)
{
if(nums[left] == val)
{
nums[left] = nums[right];
right--;
}
left++;
while(right >= 0 && nums[right] == val)
right--;
}
return left;
}
}
总结:
慢指针指向新数组的元素,一次循环后需要右移一位以便接收下次循环快指针找到的元素,当快指针遍历完nums,快指针的下标实际上就是新数组的长度。