《剑指offer》面试题53 - II. 0~n-1中缺失的数字
2024-09-06 23:18:19
问题描述
一个长度为n-1的递增排序数组中的所有数字都是唯一的,并且每个数字都在范围0~n-1之内。在范围0~n-1内的n个数字中有且只有一个数字不在该数组中,请找出这个数字。
示例 1:
输入: [0,1,3]
输出: 2
示例 2:
输入: [0,1,2,3,4,5,6,7,9]
输出: 8
限制:
1 <= 数组长度 <= 10000
代码
class Solution {
public:
int missingNumber(vector<int>& nums) {
int n = nums.size(),sum = (n*(n+1))/2;
for(int num:nums)
{
sum -= num;
}
return sum;
}
};
结果
执行用时 :44 ms, 在所有 C++ 提交中击败了20.68%的用户
内存消耗 :17.3 MB, 在所有 C++ 提交中击败了100.00%的用户
代码
class Solution {
public:
int missingNumber(vector<int>& nums) {
int n = nums.size(),i;
for(i = 0; i < n; ++i)
{
if(nums[i]!=i)
break;
}
return i;
}
};
结果
执行用时 :44 ms, 在所有 C++ 提交中击败了20.68%的用户
内存消耗 :17.3 MB, 在所有 C++ 提交中击败了100.00%的用户
代码
使用二分法,如果\(nums[middle] == middle\)说明从\([0,middle]\)是正常的,缺少的值在\([middle+1,right]\),如果\(nums[middle] != middle\)说明从\([middle,right]\)已经发生了错位,因此缺少的值在\([left,middle]\)之间。最后要注意的是返回值,很有可能\(0\)到\(n-1\)之间没有缺失,缺少数字\(n\)要特别考虑。
class Solution {
public:
int missingNumber(vector<int>& nums) {
int n = nums.size(),left = 0,right = n-1,middle;
while(left < right)
{
middle = left + (right - left)/2;
if(nums[middle] == middle)
{
left = middle + 1;
}
else
right = middle;
}
return left == n-1 && nums[left]==left?left+1:left;
}
};
结果
执行用时 :40 ms, 在所有 C++ 提交中击败了32.99%的用户
内存消耗 :17.3 MB, 在所有 C++ 提交中击败了100.00%的用户
最新文章
- Git常用命令总结
- Thrift入门及Java实例演示<;转载备用>;
- Linux重置root密码步骤
- proxmox3.2安装FreeBSD或者FreeNAS注意事项
- ASP.NET验证控件应用实例与详解。
- JPA学习---第三节:搭建JPA开发环境和全局事务介绍
- Android自定义radiobutton(文字靠左,选框靠右)
- 仿QQ5.0以上新版本侧滑效果
- C++ Primer 有感(函数)
- python 10道面试陷阱题目
- eclipse创建动态maven项目
- uboot处理dtb
- linux命令总结之tr命令
- 数据中心 CLOS 架构
- python学习 day15 (3月20日)----time
- SpringMVC RestTemplate的几种请求调用
- VC++ MFC程序设置以管理员权限运行
- matlab中log函数与rssi转距离
- 想要打动HR的心,UX设计师求职信究竟应该怎么写?
- hdu 1828 Picture 切割线求周长