记录刷题的日子8(2023.3.8)

一些感想

今天度过了比较充实的一天,学习了一些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号的题目和今天的题目补上再说,不然又要一直拖着了。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值