首页 原地哈希
文章
取消

原地哈希

原地哈希

🟧概述

🔻含义: 数组当作哈希表 通过不同场景(重复整数、缺少整数)选择标记方式(交换或者标记为负数) 判断某个值/几个值 存不存在

🔻试用场景: 数组的所有数字都是从0开始或者1开始(正数) 并且对空间复杂度要求为O(1)

🔻时间复杂度: O(n)

🔻空间复杂度: O(n)

🔻注意事项:

🔸数字必须为正数

🔸不能破坏单调性

🟧模板

📌通用模板

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
public class Temple{
    public int Solution(int[] nums) {
        int len = nums.length;
        for(int i=0;i<len;++i){
            int n =Math.abs(nums[i]);
            int idx = n-1;

            int res = markHandle(nums,idx);

            return res;

        }

        return -1;

    }

    int MarkHandle(int[]nums,int idx){
        if(nums[idx]<0){
            return idx+1;
        }else{
            nums[idx]*=-1;
        }
    }
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
public class Temple{
    public int Solution(int[] nums) {
        int len = nums.length;
        for(int i=0;i<len;++i){
            int nextIdx = nums[i]-1;
            MarkHandle(nums,nextIdx,i);
        }
        for(int i=0;i<len;++i){
            if(i+1!=nums[i]) return i+1;
        }
    }

    void MarkHandle(int[]nums,int l,int r){
        int t = nums[l];
        nums[l] = nums[r];
        nums[r] = t;
    }
}

🟧总结

🔻思考1:为什么使用原地哈希?

🔸因为可以原地操作数组 修改值 判断值 空间复杂度为O(1)

🔻思考2:原地哈希本质?

🔸本质就是利用数组的下标从0开始这一特性 使用数组下标当作索引

本文由作者按照 CC BY 4.0 进行授权

单调栈

回溯