赞
踩
看到题目的第一想法
首先想到有序数组,又要查找目标值肯定要使用二分法查询。但是不太清除区间的取法。
while(left<right) ?
OR
while(left<=right) ?
里面if(nums[mid]>target){
right=mid-1;//right=mid?
}
这些条件判断不是很清楚
class Solution { public int search(int[] nums, int target) { int left=0; int right=nums.length-1; while(left<=right){ int mid=left+((right-left)>>1); if(nums[mid]>target){ right=mid-1; }else if(nums[mid]<target){ left=mid+1; }else{ return mid; } } return -1; } }
与此对应的[left,right)区间说明right的值取不到
while(left<right)
if(nums[mid]>target){
right=mid;//因为这里mid取不到,所以实际上还是取得前一个的值
}
完整的[left,right)代码
class Solution { public int search(int[] nums, int target) { int left = 0; int right = nums.length; while(left<right){ int mid=left+((right-left)>>1); if(nums[mid]>target){ right=mid; }else if(nums[mid]<target){ left=mid+1; }else{ return mid; } } return -1; } }
class Solution { public int removeElement(int[] nums, int val) { int i,j=0; for(i=0;i<nums.length;i++){ for(j=0;j<nums.length;j++){ if(nums[j]==val){ do{ nums[j+1]=nums[j]; }while(j<nums.length); break; } } } return j; } }
然后我又换了一种方式将判断卸载另一个循环的外面,但是这次出错,因为我没有考虑到后面是不是还有元素和val的值相同,就全部前移,所以答案肯定是错的
int i=0,j=0;
for(i=0;i<nums.length;i++){
if(nums[i]==val){
for(j=i+1;j<nums.length;j++){
nums[j-1]=nums[j];
}
}
}
return j;
之后,我设置了一个变量size,表示删除后数组的长度,判断如果相等,那么size就要做size–操作。并且这时的i也要做i–操作,因为相等了i后面的位置都向前了,所以i也要向前移动,不做i–操作的话,最后会剩下一个值没有删掉。
比如:
输入:
[0,1,2,2,3,0,4,2]
2
输出:
[0,1,2,3,0,4]
预期结果:
[0,1,4,0,3]
class Solution { public int removeElement(int[] nums, int val) { int size = nums.length; for(int i=0;i<size;i++){ if(nums[i]==val){ for(int j=i+1;j<size;j++){ nums[j-1]=nums[j]; } i--; size--; } } return size; } }
class Solution {
public int removeElement(int[] nums, int val) {
int slow=0;
for(int fast=0;fast<nums.length;fast++){
if(nums[fast]!=val){
nums[slow++]=nums[fast];
}
}
return slow;
}
}
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。