MissingNumber缺失的数字,FirstMissingPositive第一个缺失的正数
2024-09-01 04:09:27
MissingNumber问题描述:给定一个数组,数组数字范围是0-n,找到缺失的数字。例如nums={0,1,3},return2。
算法分析:第一种方法,对数组进行排序,然后找到和下标不一致的数字,下标即为缺失的数字。第二种方法,对于这样的数组,如果没有缺失数字,即使没有排序,下标-数字的差相加为0.假设缺失的数字在nums.length位置,那么sum+nums.length - x = 0;
public int missingNumber(int[] nums) {
Arrays.sort(nums);
for(int i = 0; i < nums.length; i ++)
{
if(nums[i] != i)
{
return i;
}
}
return nums.length;
} //如果没有缺失数字,那么序号i-nums[i]的和sum为0;如果有缺失数字那么,缺失数字在nums.length位置,
//nums.length-x+sum=0;x=nums.length+sum;
public int missingNumber2(int[] nums) {
int sum = 0;
for(int i = 0; i < nums.length; i++)
sum = sum - nums[i] + i; return sum + nums.length;
}
FirstMissingPositive问题描述:给一个没有排序的数组,找到第一个缺失的正数,例如nums={1,2,0}return3,nums={3,4,-1,1}return2
算法分析:既然是找正数,那么肯定是从1开始的,那么我们把1放在nums[0],以此类推,我们把数组中每个元素都放在它应该在的位置。那么找到下标和数字不相符的元素,下标+1即为缺失的正数。
public static int firstMissingPositive(int[] nums) {
int i = 0;
//将nums中每一个元素都放在它所代表的数字的位置上,例如nums[1]=4,那么nums[1]就应该放在第四个位置上,也就是nums[1]=nums[nums[1]-1]
//排除负数
while(i < nums.length)
{
if(nums[i] <= 0 || nums[i] > nums.length || nums[i] == i + 1 || nums[i] == nums[nums[i]-1])
{
i++;
}
else
{
int temp = nums[i];
nums[i] = nums[temp - 1];
nums[temp - 1] = temp;
}
}
int j = 0;
for(j = 0; j < nums.length; j ++)
{
if(nums[j] != j + 1)
{
return j+1;
}
}
return j+1;
}
最新文章
- 初探领域驱动设计(2)Repository在DDD中的应用
- 实验环境里新创建成功的web application却在浏览器中返回404错误
- 微软开源.NET Core的执行引擎CoreCLR{转载}
- MSSERVER创建链接服务器
- Docker大行其道—初识
- DB2中的ROW_NUMBER() OVER()函数用法
- 用arm-linux-gcc v4.3.4交叉编译Qt4.8.3
- hdu 1880 字符串hash
- WCF遇到Oracle问题
- MD5加密 js文件
- Java反射机制示例
- Spring Cloud 自定义ConfigServer
- hadoop2.x源码编译
- [BZOJ1047][HAOI2007]理想的正方形(RMQ+DP)
- [CI]CodeIgniter快速开发指南
- Nuxt 开发 - 项目初始化
- docker commit 制作镜像
- 括弧匹配检验(check.cpp)
- [转]为Kindeditor控件添加图片自动上传功能
- 64位Oracle 11g 使用PL/SQL