class Solution {
public int search(int[] nums, int target) {
//k为数字,v为次数,利用map.getOrdefault();
HashMap<Integer,Integer> hashMap = new HashMap<>();
for(int num : nums){
hashMap.put(num,hashMap.getOrDefault(num,0)+1);
}
return hashMap.getOrDefault(target,0);
}
}
通过哈希表思路很好理解。
1.循环遍历数组
2.利用hashmap的k,v存储数字和出现次数
3.利用get返回目标值次数即可。
不过有几个问题:
1.没有利用条件中的“有序”二字。
2.需要开辟一个哈希表的内存空间。
不过作为一种方法来说,它本身没有什么大问题。
现在介绍另一种更复杂的方法->即为“二分法”。
class Solution {
public int search(int[] nums, int target) {
int leftIndex = 0;
int rightIndex = nums.length-1;
while(leftIndex<=rightIndex){
int mid = (leftIndex+rightIndex)/2;
//先找右侧边界
if(nums[mid]<=target) leftIndex=mid+1;
else if(nums[mid]>target) rightIndex = mid-1;
}
int right = leftIndex;//target右侧边界索引+1
leftIndex=0;
rightIndex = nums.length-1;
while(leftIndex<rightIndex){
int mid = (leftIndex+rightIndex)/2;
//找左侧边界
if(nums[mid]>=target) rightIndex=mid-1;
else if(nums[mid]<target) leftIndex = mid+1;
}
int left = leftIndex;//target左侧边界索引
return right-left;//
}
}
通过二分法找到target的左右两侧边界插值再+1即可算出个数了。
*但是*
如果这个数组没有target怎么办呢?
又或者数组本身就为空呢?
这个时候需要在中间在中间再加一条判断。
if(rightIndex>=0&&nums[rightIndex]!=target) return 0;