剑指 Offer 53 - I. 在排序数组中查找数字 I
统计一个数字在排序数组中出现的次数。
示例 1:
输入: nums = [5,7,7,8,8,10], target = 8
输出: 2
示例 2:
输入: nums = [5,7,7,8,8,10], target = 6
输出: 0
限制:
0 <= 数组长度 <= 50000
题解:
方法一(使用HashMap
):
- 利用
HashMap
集合的特点及一些方法搞定;
(这里没有采用jdk5.0的自动装箱和拆箱,手打出来回转型的代码,因此代码较多)
class Solution {
public int search(int[] nums, int target) {
HashMap a = new HashMap();
for(int i=0;i<nums.length;i++){
Integer b = new Integer(nums[i]);
if(a.containsKey(b)){
Object temp = a.get(b);
Integer temp1 = (Integer)temp;
int temp2 = temp1.intValue();
temp2++;
Integer temp3 = new Integer(temp2);//数据很大时,就不在原先缓存中找了,相当于新new了
a.put(b,temp3);
}
else{
a.put(b,1);
}
}
for(int i=0;i<a.size();i++){
Integer b1 = new Integer(target);
if(a.containsKey(b1)){
Integer res = (Integer)a.get(b1);
return res.intValue();
}
}
return 0;
}
}
方法二(使用ArrayList
+Collections
工具类的frequency()
静态方法):
class Solution {
public int search(int[] nums, int target) {
ArrayList a = new ArrayList();
for(int i=0;i<nums.length;++i){
Integer temp1 = new Integer(nums[i]);
a.add(temp1);
}
int res = 0;
Integer temp2 = new Integer(target);
res = Collections.frequency(a,temp2);
return res;
}
}
方法三(使用ArrayList
和List接口
特有的方法):
class Solution {
public int search(int[] nums, int target) {
ArrayList a = new ArrayList();
for(int i=0;i<nums.length;++i){
Integer temp1 = new Integer(nums[i]);
a.add(temp1);
}
Integer temp2 = new Integer(target);
if(a.contains(temp2)){
int start = a.indexOf(temp2);
int end = a.lastIndexOf(temp2);
return end-start+1;
}
return 0;
}
}
方法四(二分法
查找):
- 由于数组是有序的,我们只要查找到要查找的数字最左边的一个的下标即可,接着在进行小部分遍历即可。
class Solution {
public int search(int[] nums, int target) {
int l = 0;
int r = nums.length-1;
int mid = 0;
while(l<r){
mid = l + (r-l)/2;
if(nums[mid]==target){
r = mid;
}
else if(nums[mid]>target){
r = mid - 1;
}
else{
l = mid + 1;
}
}
int count = 0;
while(l<nums.length && nums[l++]==target){
count++;
}
return count;
}
}