题目描述
统计一个数字在排序数组中出现的次数。
方法一:二分查找
二分查找模板:
int begin = 0;
int end = array.length - 1;
while (begin < end) {
int mid = (begin + end) / 2;
if (array[mid] == k) {
int temp = mid;
while (temp <= array.length - 1) {
...;
}
int temp = mid - 1;
while (temp >= 0) {
...
}
}
if (array[mid] < k) {
begin = mid + 1;
}
if (array[mid] > k) {
end = mid - 1;
}
}
package test;
class Solution {
public int GetNumberOfK(int [] array , int k) {
if (array.length == 0) {
return 0;
}
if (array.length == 1) {
if (array[0] == k) {
return 1;
}
}
// 二分查找
int num = 0; // 数字出现的次数
int begin = 0;
int end = array.length - 1;
while (begin < end){
int mid = (begin + end) / 2;
if (array[mid] == k) {
int temp = mid;
while (temp <= array.length - 1) {
if (array[temp] != k) {
break;
}
temp++;
num++;
}
temp = mid - 1;
while (temp >= 0) {
if (array[temp] != k) {
break;
}
temp--;
num++;
}
return num;// 这里忘了两次了
}
if (array[mid] < k) {
begin = mid + 1;
}
if (array[mid] > k) {
end = mid - 1;
}
}
return num;
}
}
public class Main{
public static void main(String[] args) {
int[] a = {1,2,3,5,6,6,7};
int k = 4;
Solution p = new Solution();
int b = p.GetNumberOfK(a, 6);
System.out.println("结果:"+b);
}
}
我自己写的二分法:
import java.util.*;
class Solution {
public int GetNumberOfK(int [] array , int k) {
//二分法
if (array == null || array.length == 0) {
return 0;
}
if (array.length == 1 && array[0] == k) {
return 1;
} else if (array.length == 1 && array[0] != k) {
return 0;
}
int left = 0;
int right = array.length - 1;
int count = 0;
int mid = 0;
while (left < right) {
mid = left + (right - left) / 2;
if (array[mid] == k) {
count++;
break;
} else if (array[mid] > k) {
right = mid - 1;
} else if (array[mid] < k) {
left = mid + 1;
}
}
//mid就是k出现的地方
//定义左右指针
int l = mid - 1;
int r = mid + 1;
while ((l >= 0 && array[l] == k) || (r <= array.length - 1 && array[r] == k)) {
if (l >= 0 && array[l] == k) {
count++;
l--;
}
if (r <= array.length - 1 && array[r] == k) {
count++;
r++;
}
}
return count;
}
}
public class Main {
public static void main(String[] args) {
int[] num = {3};
int k = 3;
Solution solution = new Solution();
int list1 = solution.GetNumberOfK(num, k);
System.out.println(list1);
}
}
方法二:map(暴力)
import java.util.HashMap;
import java.util.Map;
public class Solution {
public int GetNumberOfK(int [] array , int k) {
Map<Integer, Integer> map = new HashMap<Integer, Integer>();
for(int i=0;i<array.length;i++){
if(!map.containsKey(array[i])){
map.put(array[i], 1);
}else{
map.put(array[i], map.get(array[i])+1);
}
}
return map.get(k)==null?0:map.get(k);
}
}
最暴力的:
public class Solution {
public int GetNumberOfK(int [] array , int k) {
int count=0;
for(int i=0;i<array.length;i++){
if(array[i]==k)
count++;
}
return count;
}
}