704.二分查找
就是一个正常的二分查找
class Solution {
public int search(int[] nums, int target) {
int low,high;//两个指针指向数组首尾
low=0;
high=nums.length-1;
while(low<=high){
int mid=(high-low)/2+low;//防止溢出
if(nums[mid]>target){
high=mid-1;
}else if(nums[mid]<target){
low=mid+1;
}else{
return mid;
}
}
return -1;
}
}
27.移除元素
我的目标是把所有等于val的数全部移到数组末尾去,通过左右指针的方式实现。
方法是设两个指针指向首尾元素,在两个指针相遇之前,先判断右边指针指向的数是不是等于val,如果相等,把右指针往左移动一个,其他的不变。如果不相等,执行下面的ifelse,判断左边指针指向的数是不是等于val,相等就跟右指针所指的数互换,不等就直接跳过。
之所以用两个if是因为这样就不会出现右指针的数换过来还是val的情况了。
class Solution {
public int removeElement(int[] nums, int val) {
int left=0,right=nums.length-1;//左右指针
while(left<=right){
//右指针值等于val
if(nums[right]==val){
right--;//移动右指针
continue;
}
//左指针值等于val
if(nums[left]==val){
int temp=nums[left];
nums[left]=nums[right];
nums[right]=temp;
right--;left++;//同时移左右指针
}else{left++;//移动左指针}
}
return right+1;
}
}
事实证明这么写有点呆了,看了题解之后才明白不需要这么麻烦。
直接判断左指针指向的值等不等于val就好,等于的话就把右指针的值给它,右指针要是等于val也无所谓,反正左指针没动,下次循环还要判断左指针位置上的值。只有左指针的值不等于val了,它才可以前进一位!这样真的好简单,谁懂啊,想破脑袋才想了个蠢驴解法。
class Solution {
public int removeElement(int[] nums, int val) {
int left=0,right=nums.length-1;
while(left<=right){
//左指针值等于val
if(nums[left]==val){
nums[left]=nums[right];
right--;//只移动右指针
}else{
left++;//左指针值不等于val,移动左指针
}
}
return left;
}
}