一些感想
今天度过了比较充实的一天,学习了一些C++语法知识点、计算机网络等方面的知识点,了解了C++内存方面的知识,如:堆、栈之类,new和malloc之类,这些都是在之前我几乎没有了解的,我还终于搞懂了 static 和 const 究竟是什么关键字。
想一想就觉得C++的知识繁琐而庞大,但是这种庞大也是需要的吧,毕竟要表示的意义那么多,只有非常庞大的体系才能够囊括尽可能丰富的东西。
这样想的话,我对这些琐碎的东西了解得越多,越能够熟练运用C++进行编程。
但是宇宙的法则是否是简洁呢?是不是一切原理都能用一个神圣的公式表示,而这个公式一目了然。
总之现在要先把这些知识点先弄明白,起码在现在弄清楚了这些我才能创造出尽可能简洁的代码,希望未来我也能发明非常神圣的公式吧。
剑指 Offer 53 - I. 在排序数组中查找数字 I
题目描述
统计一个数字在排序数组中出现的次数。
前言
二分查找之类的不再适用这个题目了吧。
我就常规方法查找好了。
常规方法通过了,但是被打脸的是,我看了看解答区,解答区用的方法仍然是二分法,寻找第一个等于target的数字。
这道题对我来说,在理解上有一定程度的难度
思路
1、寻找右边界
这里的右边界指的是第一个比target大的数字
int i=0,j=nums.size()-1;
while(i<=j)
{//寻找右边界,找到第一个 比target大 的数字 i
int mid=(i+j)/2;
if(nums[mid]<=target)
i=mid+1;
else
j=mid-1;
}//最后j变成了i左侧的那个数字
if(j>=0&&(nums[j]!=target)) return 0;
这里有一些需要注意的地方
(1)为什么循环条件是 i<=j
(2)为什么 i 的值加1是当 nums[mid]<=target 而非 nums[mid]<target
(3)为什么i赋值为 mid+1,而不是 mid
2、寻找左边界
while(i<=j)
{//寻找左边界
int mid=(i+j)/2;
if(nums[mid]<target)
i=mid+1;
else
j=mid-1;
}
int left=i;
3、返回出现次数
return right-left;
再见
脑子昏昏沉沉的,这个竟然是前天的题目了,实在没有时间整理了,这些疑难点先放在这里吧,把3月9号的题目和今天的题目补上再说,不然又要一直拖着了。