一、前言

1.物归原主法
给定一数组,其长度为n,其元素a[i] ∈ [ 0 , n − 1 ] \in[0, n - 1] ∈[0,n−1]时,当我们把a[i]放到i = a[i]的位置时,那些重复的数值即会出现在a[i] != i的位置处。

例子:[2, 3, 1, 0, 2, 5, 3]; 物归原主后:[0, 1, 2, 3, 2, 5, 3]。
可见,重复的数字:2在i = 4处,3在i = 6处。

当然了,有的题目做了点变体,即a[i] ∈ [ 1 , n ] \in[1, n] ∈[1,n]时,则把a[i]放到i = a[i] - 1的位置上。
例如:1放到i = 0的位置上

物归原主法见下文“二、2.代码”,核心思想:没放对(nums[i] != i)并且非重复(nums[nums[i]] != nums[i])便交换

二、物归原主法的思想来源

0.《剑指offer》面试题3:数组中重复的数字

1.题目

2.代码(java)

class Solution {public int findRepeatNumber(int[] nums) {int res = -1;for(int i = 0; i < nums.length; i++) {while(nums[i] != i && nums[nums[i]] != nums[i]) {//swap(nums[i], nums[nums[i]]);int tmp = nums[i];nums[i] = nums[tmp];nums[tmp] = tmp;}}for(int i = 0; i < nums.length; i++) {if(nums[i] != i) {res = nums[i];break;}}return res;}
}

物归原主法:first blood !

三、秒杀力扣3道题

1.448

class Solution {public List<Integer> findDisappearedNumbers(int[] nums) {List<Integer> res = new ArrayList<>();for(int i = 0; i < nums.length; i++) {while(nums[i] - 1 != i && nums[nums[i] - 1] != nums[i]) {//swap(nums[i], nums[nums[i] - 1])int tmp = nums[i];nums[i] = nums[tmp - 1];nums[tmp - 1] = tmp;}}for(int i = 0; i < nums.length; i++) {if(nums[i] - 1 != i)res.add(i + 1);}return res;}
}

剑指 Offer 03几乎一致,物归原主法:double kill !

2.442

class Solution {public List<Integer> findDuplicates(int[] nums) {List<Integer> res = new ArrayList<>();for(int i = 0; i < nums.length; i++) {while(nums[i] - 1 != i && nums[nums[i] - 1] != nums[i]) {//swap(nums[i], nums[nums[i] - 1]);int tmp = nums[i];nums[i] = nums[tmp - 1];nums[tmp - 1] = tmp;}}for(int i = 0; i < nums.length; i++) {if(nums[i] - 1 != i) {res.add(nums[i]);}}return res;}
}

剑指 Offer 03几乎一致,物归原主法:triple kill !

3.41

class Solution {public int firstMissingPositive(int[] nums) {for(int i = 0; i < nums.length; i++) {while(nums[i] > 0 && nums[i] < nums.length && nums[i] - 1 != i && nums[nums[i] - 1] != nums[i]) {//swap(nums[i], nums[nums[i] - 1]);int tmp = nums[i];nums[i] = nums[tmp - 1];nums[tmp - 1] = tmp;}}for(int i = 0; i < nums.length; i++) {if(nums[i] - 1 != i) {return i + 1;}}return nums.length + 1;}
}

剑指 Offer 03几乎一致,物归原主法:quadra kill !

之前的题目都和重复数字有关系,这道题好像和重复数字没关系,怎么也可以用物归原主法来秒杀呢?
因为物归原主法的本质是通过下标处放置的数值来判断某数字是否存在。
本题要寻找没有出现的最小正整数,显然就是判断从1起的正整数是否存在。
如果nums[i] - 1 == i,比如:i = 0,则说明,1存在。

力扣之数组篇 物归原主法 秒杀 448 442 41相关推荐

  1. 力扣 有序数组的平方

    力扣 有序数组的平方 题目描述 给定一个按非递减顺序排序的整数数组 A,返回每个数字的平方组成的新数组,要求也按非递减顺序排序. 示例 1: 输入:[-4,-1,0,3,10] 输出:[0,1,9,1 ...

  2. 力扣sql入门篇(五)

    力扣sql入门篇(五) 1 组合两个表 1.1 题目内容 1.1.1 基本题目信息 1.1.2 示例输入输出 1.2 示例sql语句 SELECT firstname,lastname,IFNULL( ...

  3. 力扣638. 大礼包(回溯法+剪枝优化)

    第八十八天 --- 力扣638. 大礼包 题目一 思路:回溯法 代码 无剪枝的回溯 剪枝优化 Sum Up 题目一 力扣:力扣638. 大礼包 思路:回溯法 1.我们先不考虑礼包,直接去买东西,就是物 ...

  4. 力扣 532. 数组中的 k-diff 数对

    题目 给你一个整数数组 nums 和一个整数 k,请你在数组中找出 不同的 k-diff 数对,并返回不同的 k-diff 数对 的数目. k-diff 数对定义为一个整数对 (nums[i], nu ...

  5. 力扣46.全排列(回溯法)

    题目: 给定一个不含重复数字的数组 nums ,返回其 所有可能的全排列 .你可以 按任意顺序 返回答案. 示例一: 输入:nums = [1,2,3] 输出:[[1,2,3],[1,3,2],[2, ...

  6. 力扣T51数组中的逆序对--困难

    代码是正确的但是对于超级大的输入时还是超时了. 运用分治排序的思想 import java.util.Arrays; public class 数组中的逆序对 {public static void ...

  7. 力扣刷题篇之【字符串篇】(一)

    ✨hello,愿意点进来的小伙伴们,你们好呐! ✨

  8. 力扣刷题篇——双指针

    ​​​​​​​ 目录 2000 题目描述

  9. 力扣学习记录(每日更新)

    文章目录 引言 简单 力扣:1 两数之和 力扣:20 有效的括号 力扣:21 合并两个有序链表 力扣:22 括号生成 力扣:27 移除元素 力扣: 35 搜索插入位置 力扣:70 [爬楼梯](http ...

最新文章

  1. LeetCode-77-Combinations
  2. BFS Codeforces Round #297 (Div. 2) D. Arthur and Walls
  3. 用python画出吉祥物
  4. 今天的中巴等各式车子的企业即时通讯
  5. Excel 如何让复制的内容保持原文本格式
  6. Java中hashCode和equals方法的正确使用
  7. 企业网站排名,关键词选择原则,6个基本策略
  8. 简述er图的作用_er图的作用是什么
  9. 如何使用Adobe Acrobat对PDF文档进行电子签名
  10. 华泰单因子测试之估值类因子(回归法)
  11. Android车载应用开发与分析(13)- 系统设置-蓝牙设置
  12. 最新多屏群控技术---手机控制手机/苹果群控/IOS群控/实时同步操作群控功能讲解以及入门教程
  13. Mycat的简单使用(一)【初了解】
  14. 测试通达信终端数据接口
  15. 基于PaddlePaddle实现的EcapaTdnn声纹识别模型
  16. FEM计算2D瞬态热传导方程
  17. 《天天向上》聚焦首个碳中和主题公园 | 北京温榆河公园
  18. 安卓实现按键录制回放
  19. 《不思议の幻想乡》:装备驱动的JRPG,刷刷刷的“反心流”体验
  20. linux系统英伟达gpu驱动卸载_怎么卸载显卡驱动-手把手教你在 Ubuntu16.04 安装 GPU 驱动 + CUDA9.0 + cuDNN7...

热门文章

  1. CommandArgument传两个以上参数
  2. ESP32 + Python守护家庭健康、自己动手做个甲醛浓度检测设备
  3. 【RP-RV1126】SDK编译常用记录
  4. 安装WPS后office出现报错的情况
  5. python爬虫餐饮行业数据分析统计服_用Python分析统计必胜客餐厅
  6. 约瑟环问题(丢手绢)
  7. css和js用哪个,yepnope(相对路径,css和js)的使用
  8. 胆碱缺乏症MCD饮食诱导脂肪肝模型 被广泛应用于肝代谢病的研究中
  9. 长城脚下婚礼展示:挚爱如此坚定!【奥帆婚礼顾问】
  10. htc t328w android4.0,Android 4.0双卡双待 HTC T328w惊喜价