对于有序数组查找一个数的位置用二分查找是合适的,而它的时间复杂度正是 O(logn)。
public int search(int[] nums, int target) {
//考虑限制条件
if(nums.length > 50000 || nums.length == 0){
return 0;
}
//二分法
int left = 0;
int right = nums.length-1;
int middle = (left + right)/2;
while(left <= right){
if(target == nums[middle]){
break; //如果target和nums[middle]相等,直接跳出
}
else if(target > nums[middle]){
left = middle + 1;
}
else{
right = middle - 1;
}
//更新middle
middle = (left + right)/2;
}
int count = 0;
int midleft = middle - 1 ;
int midright = middle + 1;
if(target == nums[middle]){
count++;
}
//考虑上述while中break情况
//左边数组的值与target比较,注意边界midleft >= 0和条件midleft--
while(midleft >= 0 && nums[midleft] == target){
count++;
midleft--;
}
//左边数组的值与target比较,注意边界midright <= nums.length-1和条件midright++
while(midright <= nums.length-1 && nums[midright] == target){
count++;
midright++;
}
return count;
}
暴力解法:先判断查找的数字是否在数组两端的元素内,然后再左右遍历元素
public int search(int[] nums, int target) {
//考虑限制条件
if(nums.length > 50000 || nums.length == 0){
return 0;
}
//如果数字比数组里第一个元素小或者最后一个元素大,直接返回0
if(target < nums[0] || target > nums[nums.length - 1]){
return 0;
}
//保存出现次数
int count = 0;
//遍历数组里面的元素
for(int i = 0; i < nums.length; i++){
if(nums[i] == target){
count++;
}
}
return count;
}