博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
剑指offer 38 数字在排序数组中出现的次数
阅读量:6832 次
发布时间:2019-06-26

本文共 4525 字,大约阅读时间需要 15 分钟。

自己的写法

class Solution {public:    int GetNumberOfK(vector
data ,int k) { int length = data.size(); if(length <= 0) return 0; for(int i = 0;i < length;i++){ } int index1 = GetFirst(data,k,0,length-1); int index2 = GetLast(data,k,0,length-1); return exit(data,k) ? (index2-index1+1) : 0; } int GetFirst(vector
data,int k,int start,int end){ if(start == end) return start; int first = 0; int mid = (start+end)/2; if(data[mid] == k){ if(data[mid-1] != k) return mid; else first = GetFirst(data,k,start,mid-1); } else if(data[mid] < k) first = GetFirst(data,k,mid+1,end); else first = GetFirst(data,k,start,mid-1); return first; } int GetLast(vector
data,int k,int start,int end){ if(start == end) return start; int last = end; int mid = (start+end)/2; if(data[mid] == k){ if(data[mid+1] != k) return mid; else last = GetLast(data,k,mid+1,end); } else if(data[mid] < k) last = GetLast(data,k,mid+1,end); else last = GetLast(data,k,start,mid-1); return last; } bool exit(vector
data,int k){ int length = data.size(); int i = 0; for(;i < length;i++){ if(data[i] == k) return true; } return false; }};

更简洁的代码

class Solution {public:    int GetNumberOfK(vector
data ,int k) { if(data.empty() || k <= 0) return 0; int FirstK = GetFirstK(data,k,0,data.size()-1); int LastK = GetLastK(data,k,0,data.size()-1); if(FirstK > -1 && LastK > -1) return LastK - FirstK + 1; else return 0; } int GetFirstK(vector
data,int k,int start,int end){ if(start > end) return -1; int mid = (end + start)/2; if(data[mid] == k){ if(data[mid-1] == k) end = mid - 1; else return mid; } else if(data[mid] > k) end = mid - 1; else if(data[mid] < k) start = mid + 1; return GetFirstK(data,k,start,end); } int GetLastK(vector
data,int k,int start,int end){ if(start > end) return -1; int mid = (end + start)/2; if(data[mid] == k){ if(data[mid+1] == k) start = mid + 1; else return mid; } else if(data[mid] > k) end = mid - 1; else if(data[mid] < k) start = mid + 1; return GetLastK(data,k,start,end); }};

 用循环的方法做:

注意一个问题,end只能等于mid - 1,不能等于mid,同样begin只能等于mid + 1,不能等于mid。如果换成mid,当只有两个数的时候,会陷入死循环!

class Solution {public:    int GetNumberOfK(vector
data ,int k) { int length = data.size(); if(length <= 0) return 0; int begin = FindFirstK(data,k); int end = FindLastK(data,k); if(begin != -1 && end != -1 ) return end - begin + 1; else return 0; } int FindFirstK(vector
data,int k){ int length = data.size(); int begin = 0; int end = length-1; while(begin < end){ int mid = (begin + end)/2; if(data[mid] == k && data[mid-1] != k) return mid; else if(data[mid] == k && data[mid-1] == k) end = mid - 1; else if(data[mid] > k) end = mid - 1; else if(data[mid] < k) begin = mid + 1; } if(data[begin] == k) return begin; else return -1; } int FindLastK(vector
data,int k){ int length = data.size(); int begin = 0; int end = length-1; while(begin < end){ int mid = (begin + end)/2; if(data[mid] == k && data[mid+1] != k) return mid; else if(data[mid] == k && data[mid+1] == k) begin = mid + 1; else if(data[mid] > k) end = mid - 1; else begin = mid + 1; } if(data[begin] == k) return begin; else return -1; }};

 

转载地址:http://rptkl.baihongyu.com/

你可能感兴趣的文章
IDDD 实现领域驱动设计-理解领域和子域
查看>>
GitHub基本操作
查看>>
微信开发(01)之如何成为开发者
查看>>
Redis 中的事务
查看>>
canvas使用3
查看>>
怎么创建MongoDB数据库
查看>>
Quart2D图形上下文
查看>>
html5 canvas旋转+缩放
查看>>
QtGui.QSplitter
查看>>
前端进阶试题css(来自js高级前端开发---豪情)既然被发现了HOHO,那我就置顶了嘿嘿!觉得自己技术OK的可以把这套题目做完哦,然后加入高级前端的社区咯...
查看>>
ODAC(V9.5.15) 学习笔记(十九)主键值自动生成
查看>>
MVC4 WebApi开发中如果想支持Session请做好如下几个方面的问题
查看>>
Android中View绘制流程以及invalidate()等相关方法分析
查看>>
nicehair
查看>>
Hibernate工作原理
查看>>
《双龍形态操盘秘笈》
查看>>
怎样查看apk须要支持的Android版本号
查看>>
各种机械键盘轴线之间的差究竟好轴
查看>>
攻略三战的完美体验3Castle Fantisia阿兰·梅希亚战争艾伦西战记它包含重做版本(这是新的艾伦·梅希亚大战)...
查看>>
reveal 使用注意事项
查看>>