【带你刷《剑指Offer》系列】【每天40分钟,跟我一起用50天刷完 (剑指Offer)】第一天

news/2025/1/13 8:04:10/

专注 效率 记忆
预习 笔记 复习 做题

欢迎观看我的博客,如有问题交流,欢迎评论区留言,一定尽快回复!(大家可以去看我的专栏,是所有文章的目录)
 
文章字体风格:
红色文字表示:重难点★✔
蓝色文字表示:思路以及想法★✔
 
如果大家觉得有帮助的话,感谢大家帮忙
点赞!收藏!转发!

本博客带大家一起学习,我们不图快,只求稳扎稳打。
由于我高三是在家自学的,经验教训告诉我,学习一定要长期积累,并且复习,所以我推出此系列。
只求每天坚持40分钟,一周学5天,复习2天
也就是一周学10道题
50天后我们就可以学完76道题,相信50天后,我们一定可以有扎实的代码基础!我们每天就40分钟,和我一起坚持下去吧!
qq群:866984458

本题出自 acwing网站
这个系列是免费的
打卡即刻退回费用。

第一天【剑指Offer例题代码 系列】

    • 1. 找出数组中重复的数字
        • 普通思路
        • 优化思路
    • 2. 不修改数组找出重复的数字
        • 两个错误的普通思路
        • 普通方法(双重循环)
        • 优化方法(优化循环次数,减去一下不需要循环的数据)

1. 找出数组中重复的数字

原题链接

在这里插入图片描述

普通思路

我想的是创建一个数组,大小为1010个
然后遍历一遍数组,记录数据出现的个数,如果个数超过1,那么就是重复数据

时间复杂度O(n*logn) 也就是排序的时间复杂度

优化思路

由于本题给了一个限制
所有数据,一定在 0-n-1 之间

也就是比如n是5
最偏激出现的可能就是

0 1 2 3 4 这样的数据
但凡出现一个重复的
那么就是

0 0 1 2 3
问题来了

如何简便的找出重复数据呢?

我们可以这样

比如所给样例为
3 2 1 0 0
第一个数据是3

那么我们去把3放到 角标为3的地方
把角标为3的数据 放到3这个位置

变成
0 2 1 3 0
同理如下

当我们想要互换的时候
我们去看 如果出现了
如下这样的
3 2 1 3 0
当第一个是3,我们把这个数放到角标为3的位置,但发现,角标为3的位置已经是3
所以直接判定 3是重复的

这个思路归结于
所有的数据大小在 0 - n-1 之间

class Solution {
public:int duplicateInArray(vector<int>& nums) {int n = nums.size();for (auto x : nums)if (x < 0 || x >= n)return -1;for (int i = 0; i < n; i ++ ) {while (nums[nums[i]] != nums[i]) swap(nums[i], nums[nums[i]]);if (nums[i] != i) return nums[i];}return -1;}
};

2. 不修改数组找出重复的数字

原题链接

在这里插入图片描述

两个错误的普通思路

错误1(空间复杂度不满足)

  1. 创建一个1010大小的数组A
  2. 遍历原数组
  3. ++A[nums[i]]
  4. 如果A[nums[i]] > 1那么说明重复

错误2(改变了原数组)

  1. 给原数组从小到大排序
  2. 然后遍历每每相邻的两个元素,看其是否相等.
  3. 因为重复的元素一定相等,一定挨着

普通方法(双重循环)

class Solution {
public:int duplicateInArray(vector<int>& nums) {for(int i = 0;  i < nums.size(); i++)for(int j = 0; j < nums.size(); j++){if(i==j)continue;if(nums[i]==nums[j])return nums[i];}}
};

优化方法(优化循环次数,减去一下不需要循环的数据)

由于所给数据范围是1-n
而数据的长度是n+1
所以一定会出现重复数据的

这种类型题,学过抽屉原理的,应该会明白这道题可以用抽屉原理思考,
关于抽屉原理可以在csdn查一下,就懂了

那么,如何利用抽屉原理思考呢?

在这里插入图片描述
需要注意的一点是
当我们计算出大于mid的个数后

是与n-mid-1的大小进行比较,划分区间(理由是这样才能满足抽屉原理)

class Solution {
public:int duplicateInArray(vector<int>& nums) {int n = nums.size();// cout << n ;int l = 1,r = n-1;while(l<r){int mid = (l + r)>> 1;int cnt = 0;for(auto x:nums)if(x>mid)cnt++;if(cnt > (n-1-mid)){l = mid+1;}else{r = mid;}}return r;}
};

http://www.ppmy.cn/news/488800.html

相关文章

Matthew Ball:十多年后AR/VR为何依然发展缓慢?

2010年&#xff0c;Magic Leap和微软就开始研发AR技术&#xff0c;直到2012年Oculus才成立&#xff0c;AR/VR经过了13年左右的时间&#xff0c;虽然受到越来越多人关注&#xff0c;但发展依然缓慢。VR的主要应用场景还是游戏&#xff0c;但VR游戏只是游戏市场的一个分支&#x…

java、jvm与.net

现在sun已经被oracle收购了&#xff01;也从侧面验证了作者的一些论断&#xff01; 当然从技术上看&#xff0c;这篇文章也是分析很精辟。反正我自己感觉c很好用&#xff0c;java以及所谓的OO更多是一些概念。 Java在自取灭亡 一个比较Java语言发展的讨论贴&#xff0c;非常…

五个字的英语单词

abide v.(by)坚持,遵守 about ad. 在周围,附近,到处;大约,差不多 prep. 关于,对于;在……周围,在……附近 a.准备 above prep. 在……上面,超过,高于a. 上面的,上述的ad. 在上面,以上 abuse v./n. 滥用;虐待;谩骂 actor n. 男演员 acute a. 敏锐的,尖锐的;(疾病)急性的 adapt v…

如果编程语言是妹纸

试想一下&#xff0c;当Java、C、Python、Ruby、PHP、C#、JS等编程语言变成了动漫人物会是怎样的一幅场景呢&#xff1f;下面就一起看看在日本作家渡辺将人的笔下&#xff0c;各种编程语言都是哪类“美女”的吧&#xff01; Java 犹如宫泽贤治的《不畏风雨》中出现的、性格木讷…

Allegro如何设置默认器件的高度信息操作指导

Allegro如何设置默认器件的高度信息操作指导 在给PCB设置限高的时候,一般会添加一个package keepout的铜皮,如下图 如果器件有高度信息,且没有超过限高要求,是不会有DRC报错的,如果器件没有高度信息,软件会默认给匹配一个高度信息,从而导致误报,如下图 可以看到默认的高…

Google C++ Style文档及常用代码规范(三):来自 Google 的奇技、其他 C++ 特性、规则特例、结束语

文章目录 Google C Style文档及常用代码规范&#xff08;三&#xff09;&#xff1a;来自 Google 的奇技、其他 C 特性、规则特例、结束语来自 Google 的奇技所有权与智能指针Cpplint 其他 C 特性右值引用变长数组和 alloca()异常运行时类型识别类型转换流前置自增和自减const用…

KD缴费中心全国话费直充97-99.5折浮动,慢充93-98折浮动9y3y.com详细报价登陆KD缴费中心查看,消费达到相应数额赠送点卡平台一套

KD缴费中心全国话费直充97-99.5折浮动&#xff0c;慢充93-98折浮动9y3y.com详细报价登陆KD缴费中心查看&#xff0c;消费达到相应数额赠送点卡平台一套

人工神经网络逼近股票价格

代码&#xff1a; import tensorflow as tf import numpy as np import matplotlib.pyplot as plt#日期15天 data np.linspace(0,14,15) #生成1到15个数 #收盘 endPrice np.array([2511.90,2538.26,2510.68,2591.66,2732.98,2701.69,2701.29,2678.67,2726.50,2681.50,2739.1…