【算法】原地哈希与快速幂

news2024/11/20 3:30:53

文章目录

  • 一、原地哈希
  • 二、快速幂
    • 2.1 指数无负数
    • 2.2 指数有负数

一、原地哈希

直接看例题:题目链接
题目描述:
给你一个未排序的整数数组 nums ,请你找出其中没有出现的最小的正整数。
请你实现时间复杂度为 O(n) 并且只使用常数级别额外空间的解决方案。

示例 1:

输入:nums = [1,2,0]
输出:3

示例 2:

输入:nums = [3,4,-1,1]
输出:2

示例 3:

输入:nums = [7,8,9,11,12]
输出:1

思路分析:
拿到这道题如果没有限制条件很容易想到两种方法,第一种就是哈希表+遍历,第二种是排序+遍历,但是第一种方法空间复杂度超限,第二种时间复杂度超限。
而这里就可以用原地哈希来做。
假设数组的长度为N,那么我们要找的数一定会在1 ~ N+1之间,因为数组的下标是0 ~ N,所以我们可以把当前数组当场哈希表。
具体实现:

把数字1放到下标为0的位置,把数字2放到下标1的位置,以此类推。也就是把数值为i的数映射到i - 1的位置。
当遍历到指定位置的时候,就把当前位置的数字放到指定位置,把指定位置的数字替换回来,重复操作,知道nums[i] == i + 1,这样遍历到后边的位置如果符合条件直接跳过。时间复杂度为O(N)。

在这里插入图片描述

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

二、快速幂

2.1 指数无负数

快速幂主要解决的是a^b % p的场景,如果正常算的话需要循环b次来计算。但是这是可以优化的:
在这里插入图片描述
可以看到每个数都是上一个数的平方 % p

先不看取模,我们现在要求a^b,其实就是从这些数字里平凑出来。

举个例子,现在要求3^5:
5的二进制表示为0101:
在这里插入图片描述
那么我们就可以循环b,当b & 1 != 0,结果就要乘上a,每次把b右移1,并且把a的值平方。

看一道例题:
题目链接

题目描述:
给定 n 组 ai,bi,pi,对于每组数据,求出 abiimodpi 的值。

输入格式

第一行包含整数 n。
接下来 n 行,每行包含三个整数 ai,bi,pi。

输出格式
在这里插入图片描述

数据范围

1≤n≤100000,1≤ai,bi,pi≤2×109

输入样例:

2
3 2 5
4 3 9

输出样例:

4
1

#include <iostream>

using namespace std;

long long qmi(int a, int b, int p)
{
    long long res = 1;
    while(b)
    {
        if(b & 1)
        {
            res = (long long)res * a % p;
        }
        b >>= 1;
        // 每个数是上一个数的平方 % p
        a = (long long)a * a % p;
    }
    return res;
}

int main()
{
    int n;
    scanf("%d", &n);
    while(n--)
    {
        int a, b, p;
        scanf("%d %d %d", &a, &b, &p);
        printf("%d\n", qmi(a, b, p));
    }
    return 0;
}

2.2 指数有负数

上面的指数都是整数,而如果指数含有负数呢?
当b < 0 的时候,只需要做两步即可:
1️⃣ 把a变成 1 / a
2️⃣ 把b变成-b

但是这里要注意当b是-2^31,直接转化成整数会导致越界,所以可以用一个long long型的变量临时存储。

class Solution {
public:
    double myPow(double x, int n) {
        double res = 1;
        long long b = n;
        if(b < 0)
        {
            x = 1 / x;
            b = -b;
        }
        while(b)
        {
            if(b & 1)
            {
                res = res * x;
            }
            b >>= 1;
            x = x * x;
        }
        return res;
    }
};


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/653591.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【机器学习】十大算法之一 “SVM”

作者主页&#xff1a;爱笑的男孩。的博客_CSDN博客-深度学习,活动,python领域博主爱笑的男孩。擅长深度学习,活动,python,等方面的知识,爱笑的男孩。关注算法,python,计算机视觉,图像处理,深度学习,pytorch,神经网络,opencv领域.https://blog.csdn.net/Code_and516?typeblog个…

python获取某乎热搜数据并保存成Excel

python获取知乎热搜数据 一、获取目标、准备工作二、开始编码三、总结 一、获取目标、准备工作 1、获取目标&#xff1a; 本次获取教程目标&#xff1a;某乎热搜 2、准备工作 环境python3.xrequestspandas requests跟pandas为本次教程所需的库&#xff0c;requests用于模拟h…

迟来的函数传参补充——传引用【引用调用】【c++】

文章目录 1、传引用1.1、特点1.2、使用1.2.1、一般引用1.2.2、常量引用 1.3、案例1.3.1、常见变量引用做函数参数1.3.2、结构体引用做函数参数 1、传引用 函数传参&#xff0c;几乎一直在用简单的值传递&#xff0c;或者传指针&#xff0c;前者生成一个源结构的副本&#xff0…

知识点滴 - 食物的寒热之分

昨晚多吃了写菠萝蜜&#xff0c;结果第二天就流鼻血了。以前吃晒干的龙眼&#xff0c;也流过鼻血。看来某些水果一次性吃太多&#xff0c;会有问题。 那就来研究研究水果的属性&#xff0c;识别哪些水果吃多了上火&#xff0c;哪些说过吃多了受寒。 中医认为&#xff0c;所有的…

sharding5.0.0分表分库

sharding官网参考 https://shardingsphere.apache.org/document/current/cn/overview/ https://shardingsphere.apache.org/document/legacy/4.x/document/cn/features/sharding/use-norms/pagination/ https://shardingsphere.apache.org/document/legacy/4.x/document/cn/d…

Hector SLAM Scan Matching 理解

Hector SLAM 参考https://www.cnblogs.com/cyberniklee/p/8484104.html 搞清楚几个点有助于对scan matching的理解 占用栅格地图中每个地图点包括点坐标、占用值最大为1&#xff0c;表示该栅格被占用的概率、以及占用值对坐标的梯度&#xff0c;由于地图点是离散的&#xff…

HashMap底层实现

首先来看一下put方法的源码&#xff0c;在HashMap中最重要的就是put方法的执行逻辑以及一些控制参数的意义比较重要。 【put方法】 问题1&#xff1a;如何计算数组位置&#xff1f; 答案&#xff1a; 1、首先在插入<K &#xff0c;V> 时&#xff0c;会先将其包装成一…

商城系统是如何分账的?-加速度shopfa

微信小程序凭借着其方便快捷&#xff0c;无需下载且依附于微信这个庞大的社交平台等特点&#xff0c;让无数的企业商家都为之痴迷&#xff0c;并都纷纷投入到了小程序的搭建工作&#xff0c;但你知道吗&#xff0c;通过小程序进行交易&#xff0c;资金的结算是十分复杂的&#…

使用单元测试框架unittest进行有效测试

一、介绍 在软件开发中&#xff0c;单元测试是一种测试方法&#xff0c;它用于检查单个软件组件&#xff08;例如函数或方法&#xff09;的正确性。Python 提供了一个内置的单元测试库&#xff0c;名为 unittest&#xff0c;可以用来编写测试代码&#xff0c;然后运行测试&…

基于Java图书管理系统设计实现(源码+lw+部署文档+讲解等)

博主介绍&#xff1a; ✌全网粉丝30W,csdn特邀作者、博客专家、CSDN新星计划导师、java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战 ✌ &#x1f345; 文末获取源码联系 &#x1f345; &#x1f447;&#x1f3fb; 精…

springboot+vue漫画网站(java项目源码+文档)

风定落花生&#xff0c;歌声逐流水&#xff0c;大家好我是风歌&#xff0c;混迹在java圈的辛苦码农。今天要和大家聊的是一款基于springboot的漫画网站。项目源码以及部署相关请联系风歌&#xff0c;文末附上联系信息 。 &#x1f495;&#x1f495;作者&#xff1a;风歌&#…

Elasticsearch:实用 BM25 - 第 2 部分:BM25 算法及其变量

BM25算法 我将尽可能深入这里的数学以解释正在发生的事情&#xff0c;但这是我们查看 BM25 公式的结构以深入了解正在发生的事情的部分。 首先我们来看看公式&#xff0c;然后我将把每个组件分解成可以理解的部分&#xff1a; 我们可以看到一些常见的组件&#xff0c;如 qi、I…

第二期丨INTERSPEECH 2023 论文预讲会

INTERSPEECH 2023 论文预讲会是由CCF语音对话与听觉专委会、语音之家主办&#xff0c;旨在为学者们提供更多的交流机会&#xff0c;更方便、快捷地了解领域前沿。活动将邀请 INTERSPEECH 2023 录用论文的作者进行报告交流。 INTERSPEECH 2023 论文预讲会第二期邀请到华南理工大…

无线耳机什么牌子的好?质量好性价比高 ?八款蓝牙耳机分享

随着TWS技术在应用层面的日益完善&#xff0c;真无线蓝牙耳机就越来越受欢迎了&#xff0c;完全摒弃了线材的束缚&#xff0c;做到了真正的无线耳机&#xff0c;这简直是无法忍受耳机线的强迫症的福音&#xff0c;而且现在不仅是佩戴时会格外的舒适&#xff0c;随着无线技术的不…

【面试题必问】浏览器是如何实现生成HTTP消息的

我们经常会使用浏览器访问各种网站&#xff0c;获取各种信息&#xff0c;帮助解决工作生活中的问题。那你知道&#xff0c;浏览器是怎么帮助我们实现对web服务器的访问&#xff0c;并返回给我们想要的信息吗&#xff1f; 1. 浏览器生成HTTP消息 我们平时使用的浏览器有很多种&…

图解LeetCode——437. 路径总和 III

一、题目 给定一个二叉树的根节点 root &#xff0c;和一个整数 targetSum &#xff0c;求该二叉树里节点值之和等于 targetSum 的 路径 的数目。 路径 不需要从根节点开始&#xff0c;也不需要在叶子节点结束&#xff0c;但是路径方向必须是向下的&#xff08;只能从父节点到…

AI智能视频技术在安防监控领域的场景应用

AI智能视频技术是一种基于人工智能、深度学习和计算机视觉等技术的视频处理技术。它可以通过对视频进行分析和识别&#xff0c;实现各种智能化应用&#xff0c;如视频监控、智能家居、自动驾驶等。 目前&#xff0c;AI智能视频技术已经实现了人脸识别、行为分析、智能跟踪、场…

测试用例excel转word(Office word篇)

场景 我们在项目中&#xff0c;默认情况下是用我们的Excel用例模版输出测试用例。但是有的项目中&#xff0c;会要求在Word版本的测试计划或者测试报告中&#xff0c;写明测试用例。而我们的测试用例&#xff0c;有的项目有上千条&#xff0c;这个时候如果从Excel往Word中复制…

【支付宝小程序】医保接入文档网址

【支付宝小程序】医保接入文档 自己注意事项&#xff1a; 授权 my.getAuthCode跳转与参数 处理 my.ap.navigateToAlipayPage联调 测试开发者加入 白名单

【前端播放器】修改前端参数,减少时延

目录 程序修改 海康 CM8 换上新的jessibuca-3 好像提高到了1S内 与2.8的旧版本比下 191-196-2.8三个对比 jessibuca-pro 延时测试 jessibuca-pro 300ms 超低延迟 wvp-webrtc wvp-webrtc vs vms webrtc > jessibuca-pro > jessibuca 总体 参考资料 程序修改 …