剑指offer按数据结构分类刷题记录
数组
第三题:
- 排序 2. 遍历数组,若相邻元素相等,则返回该元素
第四题:
从左下or右上开始遍历,若>target,则排除一行or一列;若<target,则排除一列or一行
第十题:
递归
第十七题:
第二十九题
第五十三题
解法一:普通遍历,O(n)
public class Solution {
public int GetNumberOfK(int [] array , int k) {
if(array.length==0) return 0;
int count=0;
for(int i=0;i<array.length;i++){
if(array[i]==k){
count++;
}
}
return count;
}
}
解法二:二分查找到k的位置,向左、右遍历,O(n)
略
解法三:二分查找到k的上下界,坐标相减,O(logn)
tips: k上界=k+1下界
注:下界指k出现的最小位置
public class Solution {
public int GetNumberOfK(int [] array , int k) {
int count1=bSearch(k,array);
int count2=bSearch(k+1,array);
return count2-count1;
}
public int bSearch(int k,int []array){
int left=0;
int right=array.length-1;
while(left<=right){
int mid=left+(right-left)/2;
if(array[mid]<k) left=mid+1;//mid小,在右半段查找
else right=mid-1;//mid大,在左半段查找;mid等,往左一步找k的第一位
}
return left;
}
}