目标:分别写一段查找大数组查找某个数字出现字数的方法,这里给出本人的代码
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
public class SearchArray {
/**
* 二分法查找(每次将数组分为两段),针对有序列表可用,时间复杂度为O(logN)。
* @param array 目标(待查)数组
* @param target 目标值
* @return 目标值出现次数
*/
public int binarySearch(List<Integer> array, int target) {
int length = array.size();
int middle = length/2;
int middle_item = array.get(middle);
if (middle_item > target) {
//TODO: 向左查找(递归)
return binarySearch(array.subList(0, middle), target);
} else if (middle_item < target) {
//TODO: 向右查找(递归)
return binarySearch(array.subList(middle, length), target);
} else {
//TODO: 左右查找
List<Integer> leftArray = array.subList(0, middle);
List<Integer> rightArray = array.subList(middle, length);
int count = 0;
for (int i = leftArray.size()-1; i > 0; i--) {
int leftItem = leftArray.get(i);
if (leftItem == target) {
count++;
} else {
break;
}
}
for (int j = 0; j < rightArray.size(); j++) {
int rightItem = rightArray.get(j);
if (rightItem == target) {
count++;
} else {
break;
}
}
return count;
}
}
public static void main(String[] args) {
SearchArray sa = new SearchArray();
// 有序列表查找
List<Integer> orderlyArray = new ArrayList(Arrays.asList(1, 2, 3, 3, 3, 3, 4, 5, 6, 7, 7, 8, 9));
System.out.println(sa.binarySearch(orderlyArray, 3));
System.out.println(sa.binarySearch(orderlyArray, 7));
}
}
以上是本人代码以及测试部分,有更加快速或精简版本的还望大神指正。