704二分查找
题目位置:力扣(LeetCode)官网 - 全球极客挚爱的技术成长平台
“左闭右闭”方法
左闭右闭: 所谓左闭右闭,就是我们认为这个target始终存在于我们的区间范围内。
有以下几个关键代码节点:
-
right=nums.length-1 //仍然是贯彻左闭右闭这个原则
-
if语句中,left=mid+1 ; right=mid-1; //还是为了左闭右闭
具体代码实现如下:
class Solution {
public int search(int[] nums, int target) {
if(target<nums[0] || target>nums[nums.length-1]){
return -1;
}
int left=0;
int right=nums.length-1;
while(left<=right){
int mid=left+(right-left)/2;
if(nums[mid]<target)
left=mid+1;
else if(nums[mid]>target)
right=mid-1;
else
return mid;
}
return -1;
}
}
”左闭右开“方法
左闭右开: 所谓左闭右开——即这个target如果存在的话,只会存在于left~right-1这个区间之内,而right一定是找不到target的
代码要点:
-
right=nums.length; //此时就不能是length-1了,初始化时就必须“右开”
-
if判断语句中,right=mid; //仍然是为了右开
具体代码
class Solution {
public int search(int[] nums, int target) {
if(target<nums[0] || target>nums[nums.length-1]){
return -1;
}
int left=0;
int right=nums.length;
while(left<right){
int mid=left+(right-left)/2;
if(nums[mid]<target)
left=mid+1;
else if(nums[mid]>target)
right=mid;
else
return mid;
}
return -1;
}
}
35.搜索插入位置
题目位置:力扣(LeetCode)官网 - 全球极客挚爱的技术成长平台
这里考量的也是二分查找算法,如果target不存在于nums[]之中,个人认为使用左闭右开的算法简单一下,跳出循环的那个节点:left==right,就直接是需要插入的下标位置。
class Solution {
public int searchInsert(int[] nums, int target) {
if(target<nums[0])
return 0;
if(target>nums[nums.length-1])
return nums.length;
int left=0;
int right=nums.length;
while(left<right){
int mid=left+(right-left)/2;
if(nums[mid]<target)
left=mid+1;
else if(nums[mid]>target)
right=mid;
else
return mid;
}
return left;
}
}
27.移除元素
题目具体位置力扣(LeetCode)官网 - 全球极客挚爱的技术成长平台
暴力解法
遍历一次整个数组,只要发现其中元素等于val,就将其后面的所有元素都往前挪一位。
具体代码如下:
class Solution {
public int removeElement(int[] nums, int val) {
if(nums.length==0)
return 0;
int len=nums.length;
for(int i=0;i<len;i++){
if(nums[i]==val){
for(int j=i+1;j<len;j++){
nums[j-1]=nums[j];
}
i--;
len--;
}
}
return len;
}
}
双指针法
快慢指针
class Solution {
public int removeElement(int[] nums, int val) {
if(nums.length==0)
return 0;
int left=0;
int right=0;
int len=nums.length;
for(right=0;right<len;right++){
if(nums[right]!=val){
nums[left]=nums[right];
left++;
}
}
return left;
}
}
相向指针
class Solution {
public int removeElement(int[] nums, int val) {
if(nums.length==0)
return 0;
int len=nums.length;
int left=0;
int right=len-1;
while(right>=0 && nums[right]==val )
right--;
while(left<=right){
if(nums[left]==val){
int temp=nums[left];
nums[left]=nums[right];
nums[right]=temp;
}
left++;
while(nums[right]==val && right>=0)
right--;
}
return left;
}
}