首页 > 其他分享 >特殊哈希表-原地哈希

特殊哈希表-原地哈希

时间:2023-05-24 19:57:58浏览次数:48  
标签:特殊 数组 nums int 原地 ++ 哈希 ans

例题一

链接:41.缺失的第一个正数
image

题解

一种简单的方法是利用map,但是空间复杂度不符合条件;另一种简单的方法是直接排序,但是时间复杂度不符合条件。于是我们结合两者,提出一种算法,姑且称之为·原地哈希·。该算法是基于比较的排序,不需要额外的空间:给定长度为N的数组,我们想将其变换为这样一个形式:[1,2,3,...,N],但是实际上肯定会有部分数是错误的,每一个错误的位置就代表了一个缺失的正数。以题目中的示例二 [3, 4, -1, 1] 为例,恢复后的数组应当为 [1, -1, 3, 4],我们就可以知道缺失的数为2。
我们可以对数组进行一次遍历,对于遍历到的数 \(x=nums[i]\) ,如果 \(x∈[1,N]\) ,我们就知道 \(x\) 应当出现在数组中的 \(x−1\) 的位置,因此交换 \(nums[i]\) 和 \(nums[x−1]\) ,这样 \(x\) 就出现在了正确的位置。在完成交换后,新的 \(nums[i]\) 可能还在 [1,N] 的范围内,我们需要继续进行交换操作,直到 \(x∉[1,N]\)。此外,如果 \(nums[x - 1]=nums[i]\),就说明已经处于正确的位置,因此不必交换。
代码如下:

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

例题二

链接:287.寻找重复数
image

题解

该题与上一题一样,也采用原地哈希的方法,代码如下:

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

标签:特殊,数组,nums,int,原地,++,哈希,ans
From: https://www.cnblogs.com/parallel-138/p/17429329.html

相关文章

  • 类是一个特殊的对象(类对象)
    类是一个特殊的对象(类对象)classPhone:实例对象myphone=Phone()●在程序运行时,类同样会被加载到内存●在Python中,类是一个特殊的对象:类对象●在程序运行时,类对象在内存中只有一份,使用一个类可以创建出很多个对象实例●除了封装实例的属性和方法外,类对象还可以拥有自己的属性......
  • 不同路径 II(数组、动态规划)、同构字符串(哈希表、字符串)、颠倒二进制位(位运算、分
    不同路径II(数组、动态规划)一个机器人位于一个_mxn_网格的左上角(起始点在下图中标记为“Start”)。机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角(在下图中标记为“Finish”)。现在考虑网格中有障碍物。那么从左上角到右下角将会有多少条不同的路径?网......
  • shell特殊符号梳理
    1$相关关键词shell中与@和n等经常被使用,但是有时候仍然对部分符号记忆不是很深刻,特地整理成表格方便记忆。-描述备注$0当前脚本文件名$n传递给脚本或函数的参数$#传递给脚本或函数的所有参数个数$*传递给脚本或函数的所有参数当它们被双引号("“)包含时,”$*"会将所有的参数作为......
  • leetcode2215哈希列表的应用
    哈希列表存储的是不重复的元素,使用两个哈希列表存储这两个数组。再遍历其中一个哈希列表,查看是否存在另一个哈希列表中set.insert()set1.count(元素)for(intnum:nums1){set1.insert(num);}for(intnum:set1){if(!set2.count(num)){res[0].push_back(num);......
  • 你说啥?Redis中除了五大数据类型,还有特殊数据类型!
    一、geospatial地理位置1.1>概述可以用于基于地理位置的业务场景。比如:查询两地之间的距离,方圆几里存在的地理位置等等。Redis提供了geospatial相关的8个指令,操作如下图所示:1.2>GEOADD(v3.2.0)指令格式:GEOADDkeylongitudelatitudemember[longitudelatitudemember...]指令含......
  • nc和ncat的特殊使用
    在平常使用nc只会反弹shell,和文件传输,这里学到一些其他的使用方法记录一下反弹shell#反弹shellnc-lvp4444-e/bin/bashnc-nvtarget_iptarget_port#常用的反弹shellnc-lvp4444nc-nvattack_ipattack_port-e/bin/bash注意:在最新的netcat中,不自在-e或者......
  • Redis笔记(二):三种特殊类型
    geospatial地理位置GEOADDkey[NX|XX][CH]longitudelatitudemember[longitudelatitudemember...]地球两极无法直接添加经度纬度GEODIST#单位m,km,mi,ftGEOHASHGEOPOSGEORADIUSGEORADIUSBYMEMBERJava中的数据结构......
  • Java split方法一个或多个特殊字符分割
    publicstaticvoidmain(String[]args){ Strings="ab|cd|ef";//Strings="ab;cd,ef";//String[]split=s.split(";|,"); String[]split=s.split("\\|");// System.out.println(split[0]); for(in......
  • 哈希表简单应用—两数之和
    这是一个简单题,本质上直接暴力求解也可以了。但是主要记录下哈希表的应用。给定一个整数数组nums和一个整数目标值target,请你在该数组中找出和为目标值target 的那两个整数,并返回它们的数组下标。你可以假设每种输入只会对应一个答案。但是,数组中同一个元素在答案里不......
  • css 样式文件中的特殊符号 - 波浪号(也叫 tilde,squiggle,twiddle)
    例子:.check:checked~.content{}~选择器实际上是后继同胞组合器(在2017年之前称为一般同胞组合器):后继同胞组合器由“波浪号”(U+007E,~)字符组成,它将两个简单选择器序列分隔开。由这两个序列表示的元素在文档树中具有相同的父级,并且由第一个序列表示的元素位于由第二个序列表......