剑指offer-数字在排序数组中出现的次数
来源:互联网 发布:淘宝省市区三级联动js 编辑:程序博客网 时间:2024/06/16 17:13
问题
题目:[剑指offer-数字在排序数组中出现的次数]
思路
朴素的思路不说了,扫一遍就行了。
代码
class Solution {public: int GetNumberOfK(vector<int> data ,int k) { int sz = data.size(); if(!sz) return 0; int i = 0; int cnt = 0; // find the start while( i < sz && data[i] != k ) ++i; if( i == sz ) return 0; while( i < sz && data[i] == k ){ ++cnt; ++i; }; return cnt; }};
思路1
参考了这篇链接[剑指Offer面试题:32.数字在排序数组中出现的次数]
的确是学到了更好的思路,主要也是自己对于排序数组还是不够敏感。
对于数组类题目,其实常见的处理思路就那么多。如果无序,看看考虑能不能排序之后再做处理。像这种题目本生就给你有序的序列,最直接的考虑就是binary_search.
可以考虑找到K的起始位置和终止位置,直接返回下标之差+1即可。因为本生就是有序的,所以这点非常方便。
代码1
class Solution {public: int GetNumberOfK(vector<int> data ,int k) { int sz = data.size(); if(!sz) return 0; int first = find_first_k( data, 0, sz-1, k ); if(-1 == first) return 0; int last = find_last_k( data, 0, sz-1, k ); if(-1 == last) return 0; return last - first + 1; }private: int find_first_k( vector<int>& arr, int low, int high, int k ){ while( low <= high ){ int mid = (low+high)/2; if( k < arr[mid] ) high = mid - 1; else if( arr[mid] < k ) low = mid + 1; else{ if( low <= mid-1 ){ // 判断前一个元素是否存在 if( arr[mid-1] != k ) return mid; else high = mid - 1; } else{ return mid; } } } return -1; } int find_last_k( vector<int>& arr, int low, int high, int k ){ while( low <= high ){ int mid = (low+high)/2; if( k < arr[mid] ) high = mid - 1; else if( arr[mid] < k ) low = mid + 1; else{ if( mid+1 <= high ){ // 判断后一个元素是否存在 if( arr[mid+1] != k ) return mid; else low = mid + 1; } else{ return mid; } } } return -1; }};
阅读全文
0 0
- 【剑指offer】数字在排序数组中出现的次数
- 剑指offer--数字在排序数组中出现的次数
- 《剑指offer》数字在排序数组中出现的次数
- 剑指offer:数字在排序数组中出现的次数
- 剑指offer-数字在排序数组中出现的次数
- 剑指offer:数字在排序数组中出现的次数
- [剑指offer]数字在排序数组中出现的次数
- 剑指offer 数字在排序数组中出现的次数
- [剑指offer]数字在排序数组中出现的次数
- 剑指offer|数字在排序数组中出现的次数
- 剑指offer-数字在排序数组中出现的次数
- 《剑指offer》-数字在排序数组中出现的次数
- 剑指offer - 数字在排序数组中出现的次数
- 剑指offer-数字在排序数组中出现的次数
- 【剑指offer】数字在排序数组中出现的次数
- 剑指offer:数字在排序数组中出现的次数
- 《剑指offer》数字在排序数组中出现的次数
- 剑指offer-数字在排序数组中出现的次数
- Eclipse中使用Git
- 兼容IE8问题
- 剑指offer-数字在排序数组中出现的次数
- java List的<>中 方法参数是父类对象的list。传入子类对象时的处理
- 软件设计原则概述
- 剑指offer-数字在排序数组中出现的次数
- 图形之可见面判别算法
- 【剑指Offer】面试题60:把二叉树打印成多行
- List集合排序工具类
- SQLite线程模式探讨
- java的核心入门到放弃————面向对象小结
- C# 字符之间的转换
- spring 解读之 DI 、AOP
- 001初识java