算法基础二

算法基础课——第一章 基础算法(二) 高精度问题其实只有使用 C++ 编程语言的同学需要关注,使用 java 或 python 编程语言的同学不需要太多关注。因为 java 有大整数类,python 自带的数据范围默认就是无限大,而 C++ 没有相对应的处理大整数运算的数据结构。高精度的考察主要分为四种:高精度{加法A+B减法A−B乘法A×a除法A÷a高精度\begin{cases}加法 \quad A+B \\ 减法 \quad A-B \\ 乘法 \quad A \times a \\ 除法 \quad A \div a\end{cases 阅读详情

回文数

给你一个整数 x ,如果 x 是一个回文整数,返回 true ;否则,返回 false 。回文数是指正序(从左向右)和倒序(从右向左)读都是一样的整数。

示例 1:
输入:x = 121
输出:true

示例 2:
输入:x = -121
输出:false
解释:从左向右读, 为 -121 。 从右向左读, 为 121- 。因此它不是一个回文数。

示例 3:
输入:x = 10
输出:false
解释:从右向左读, 为 01 。因此它不是一个回文数。

解题思路:注意负数,10的情况。

    public boolean isPalindrome(int x) {
        // 如果是10的倍数也不是回文
        if (x < 0 || (x % 10 == 0 && x != 0)) {
            return false;
        }
        
        int revertedNumber = 0;
        while(x > revertedNumber) {
            revertedNumber = revertedNumber * 10 + x % 10;
            x /= 10;
        }

        return x == revertedNumber || x == revertedNumber / 10;

    }

盛最多水的容器

给定一个长度为 n 的整数数组 height 。有 n 条垂线,第 i 条线的两个端点是 (i, 0) 和 (i, height[i]) 。找出其中的两条线,使得它们与 x 轴共同构成的容器可以容纳最多的水。返回容器可以储存的最大水量。

示例 1:
在这里插入图片描述> 输入:[1,8,6,2,5,4,8,3,7] 输出:49 解释:图中垂直线代表输入数组
[1,8,6,2,5,4,8,3,7]。在此情况下,容器能够容纳水(表示为蓝色部分)的最大值为 49。

示例 2: 输入:height = [1,1] 输出:1

解题思路: 首尾两个指针,每次移动后判断长宽的乘机是否最大。

   public int maxArea(int[] height) {
        if (height == null || height.length == 0) {
            return 0;
        }

        int cap = 0;
        int i = 0;
        int j = height.length - 1;
        while(i < j) {
            if (height[i] < height[j]) {
                cap = Math.max(cap, (j - i) * height[i++]);
            } else {
                cap = Math.max(cap, (j - i) * height[j--]);
            }
        }
   
        return cap;
    }

整数转罗马数字

罗马数字包含以下七种字符: I, V, X, L,C,D 和 M。

字符          数值
I             1
V             5
X             10
L             50
C             100
D             500
M             1000

例如, 罗马数字 2 写做 II ,即为两个并列的 1。12 写做 XII ,即为 X + II 。 27 写做 XXVII, 即为 XX + V + II 。
通常情况下,罗马数字中小的数字在大的数字的右边。但也存在特例,例如 4 不写做 IIII,而是 IV。数字 1 在数字 5 的左边,所表示的数等于大数 5 减小数 1 得到的数值 4 。同样地,数字 9 表示为 IX。这个特殊的规则只适用于以下六种情况:
I 可以放在 V (5) 和 X (10) 的左边,来表示 4 和 9。
X 可以放在 L (50) 和 C (100) 的左边,来表示 40 和 90。
C 可以放在 D (500) 和 M (1000) 的左边,来表示 400 和 900。
给你一个整数,将其转为罗马数字。

解题思路:按照罗马数字的字符数值,计算出对应罗马数字的十进制数即可。

 	int[] values = {1000, 900, 500, 400, 100, 90, 50, 40, 10, 9, 5, 4, 1};
    String[] symbols = {"M", "CM", "D", "CD", "C", "XC", "L", "XL", "X", "IX", "V", "IV", "I"};

    public String intToRoman(int num) {
        StringBuffer roman = new StringBuffer();
        for (int i = 0; i < values.length; ++i) {
            int value = values[i];
            String symbol = symbols[i];
            while (num >= value) {
                num -= value;
                roman.append(symbol);
            }
            if (num == 0) {
                break;
            }
        }
        return roman.toString();

    }

三数之和

给你一个整数数组 nums ,判断是否存在三元组 [nums[i], nums[j], nums[k]] 满足 i != j、i != k 且 j != k ,同时还满足 nums[i] + nums[j] + nums[k] == 0 。请你返回所有和为 0 且不重复的三元组。
注意:答案中不可以包含重复的三元组。

示例 1:
输入:nums = [-1,0,1,2,-1,-4]
输出:[[-1,-1,2],[-1,0,1]]
解释:
nums[0] + nums[1] + nums[2] = (-1) + 0 + 1 = 0 。
nums[1] + nums[2] + nums[4] = 0 + 1 + (-1) = 0 。
nums[0] + nums[3] + nums[4] = (-1) + 2 + (-1) = 0 。
不同的三元组是 [-1,0,1] 和 [-1,-1,2] 。
注意,输出的顺序和三元组的顺序并不重要。

示例 2:
输入:nums = [0,1,1]
输出:[]
解释:唯一可能的三元组和不为 0 。

示例 3:
输入:nums = [0,0,0]
输出:[[0,0,0]]
解释:唯一可能的三元组和为 0 。

解题思路:用map提前计算好两数之和,临时缓存起来,可以将复杂度降到O(N^2),比较麻烦的在于最后要输出不重复的解,数组中同一个数字可能出现多次,但是最后解不能重复,所以需要去重和排序。map记录每个数字出现的次数,然后对key进行排序,最后在排序之后的数组里面去查找,找到另外两个数字能和自己组成0。

首先对数组进行排序,排序后固定一个数 nums[i]nums[i]nums[i],再使用左右指针指向 nums[i]nums[i]nums[i]后面的两端,数字分别为 nums[L]nums[L]nums[L] 和 nums[R]nums[R]nums[R],计算三个数的和 sumsumsum 判断是否满足为 000,满足则添加进结果集

如果 nums[i]nums[i]nums[i]大于 000,则三数之和必然无法等于 000,结束循环
如果 nums[i]nums[i]nums[i] == nums[i−1]nums[i-1]nums[i−1],则说明该数字重复,会导致结果重复,所以应该跳过
当 sumsumsum == 000 时,nums[L]nums[L]nums[L] == nums[L+1]nums[L+1]nums[L+1] 则会导致结果重复,应该跳过,L++L++L++
当 sumsumsum == 000 时,nums[R]nums[R]nums[R] == nums[R−1]nums[R-1]nums[R−1] 则会导致结果重复,应该跳过,R−−R--R−−
时间复杂度:O(n2)O(n^2)O(n2 ),n 为数组长度

 public List<List<Integer>> threeSum(int[] nums) {
        List<List<Integer>> ans = new ArrayList();

        int len = nums.length;
        // 小于3个数直接返回空
        if (nums == null || len < 3) {
            return ans;
        }

        // 排序
        Arrays.sort(nums);

        for(int i = 0; i < len; i++) {
            if(nums[i] > 0) {
                break;
            }
            if(i > 0 && nums[i] == nums[i - 1]) {
                // 连续两数一样,去重
                continue;
            }
            int l = i + 1; // 从左边开始
            int r = len - 1; // 从右边开始
            while(l < r) {
                int sum = nums[i] + nums[l] + nums[r];
                if (sum == 0) {
                    ans.add(Arrays.asList(nums[i], nums[l], nums[r]));
                    while(l < r && nums[l] == nums[l + 1]) {
                        l++;
                    }
                    while(l < r && nums[r] == nums[r - 1]) {
                        r--;
                    }
                    l++;
                    r--;
                } else if(sum < 0) {
                    l++;
                } else if(sum > 0) {
                    r--;
                }
            }
        }
        return ans;
    }

最接近的三数之和

给你一个长度为 n 的整数数组 nums 和 一个目标值 target。请你从 nums 中选出三个整数,使它们的和与 target 最接近。返回这三个数的和。假定每组输入只存在恰好一个解。

示例 1:
输入:nums = [-1,2,1,-4], target = 1
输出:2
解释:与 target 最接近的和是 2 (-1 + 2 + 1 = 2) 。

示例 2:
输入:nums = [0,0,0], target = 1
输出:0

解题思路:用两个指针的方法,先对数组进行排序,i从头开始往后走。这里需要注意数组中存在多个重复数字的问题。j,k 两个指针一前一后相向移动。


  public int threeSumClosest(int[] nums, int target) {
        // 先排序
        Arrays.sort(nums);
        int ans = nums[0] + nums[1] + nums[2];
        for(int i = 0; i < nums.length; i++) {
            int start = i + 1;
            int end = nums.length - 1;
            while(start < end) {
                int sum = nums[start] + nums[end] + nums[i];
                if(Math.abs(target - sum) < Math.abs(target - ans)) {
                    ans = sum;
                }
                if(sum > target) {
                    end--;
                } else if(sum < target) {
                    start++;
                } else {
                    return ans;
                }
            }
        }
        return ans;
    }
算法(二)- 算法分析基础 算法(二)- 算法分析基础一、反证法 数学归纳法反证法数学归纳法二、算法分析基础任务评价和算法执行时间相关因素算法效率衡量方法时间复杂度估算时间复杂度的上下界时间复杂度的最好情况和最坏情况空间复杂度非递归算法分析1.仅依赖于问题规模的时间复杂度2.时间复杂度与输入实例的初始状态有关递归(推)方程的求解例子:Hanoi塔直接迭代:插入排序最坏情况下时间分析二分归并排序:迭代模型:递归树主定理:递归算法分析尝试法:快速排序列出二分检索方法的递推方程,并采用主定理方法求出其算法的时间复杂度。 一、反证法 数学归纳 阅读详情

相关推荐

LTspice进阶技巧-031.一键加密仿真模型:LTspice Encrypt Tool实战指南

本文详细介绍了LTspice Encrypt Tool的使用方法,帮助工程师一键加密LTspice仿真模型,保护知识产权。通过图形化界面简化操作流程,支持批量加密和兼容性处理,适用于电路设计中的模型保护需求。

weixin_28304023的博客 202

【基础算法总结】双指针算法二

利用单调性,使用双指针算法解决问题。

fight_p的博客 1531

不用敲命令!用宝塔面板可视化部署pbootCMS的保姆级教程(2024最新版)

本文提供2024年最新版pbootCMS可视化部署教程,全程使用宝塔面板操作,无需任何命令行知识。从服务器初始化、LNMP环境配置到源码上传、安装向导,手把手指导用户通过图形化界面快速搭建专业网站,适合零基础新手和追求高效建站的用户。

weixin_42509507的博客 490

【基础算法总结】前缀和二

【基础算法总结】前缀和二

fight_p的博客 1273

Zabbix监控联想服务器XCC的SNMPv3配置实战

本文详细介绍了如何通过SNMPv3协议配置Zabbix监控联想服务器XCC的实战方法。文章从安全角度阐述了选择SNMPv3的必要性,并分步讲解了在XCC中启用SNMPv3、创建认证用户,以及在Zabbix中导入专用模板、创建主机并关联模板的完整流程,帮助运维人员实现对服务器硬件健康状态的自动化、安全监控。

weixin_29210727的博客 465

Unity Sprite Editor切片功能详解:如何快速将一张大图拆分成多个小图(附常见问题解决)

本文详细解析了Unity Sprite Editor的切片功能,指导开发者如何高效地将一张大图拆分为多个独立小图。文章涵盖了自动与手动切片操作步骤、轴心点设置、子精灵命名管理等核心技巧,并针对切片错位、性能优化等常见问题提供了实用解决方案,帮助提升2D游戏资源处理效率。

i0j1k2l3m的博客 646

基础算法二。

二分和那个啥,啥,啥(我忘了); 哦,位运算吧(应该是的) #include<iostream> //A题 #include<cstdio> #include<string> #include<cstring> #include<algorithm> #include<cmath> #include<deque> #include<queue> #include<vector> #

weixin_45891589的博客 228

Proxmox VE 9 更换源

创建一键更换Proxmox VE 9.0源的Bash脚本,实现快速替换软件源。脚本需包含订阅提醒关闭功能,兼容Proxmox VE 9.0系统,执行命令为bash /proxmox_9.0_Repo.sh。该工具可简化源配置过程,自动处理系统更新源替换及订阅提示屏蔽,适合需要快速配置Proxmox环境的用户使用。

极致,细节 4984

【基础算法总结】滑动窗口二

滑动窗口二

fight_p的博客 1181

SXU-软件项目管理-朱少民-第九章 项目监控与控制 第十章 项目收尾 附相关习题

软件项目管理-朱少民-第九章 项目监控与控制 附相关习题

weixin_63597914的博客 1488

Halcon 深度学习实战:PCB 缺陷检测模型的 TensorRT/OpenVino 加速推理

本文介绍了如何利用TensorRT和OpenVino对Halcon深度学习模型进行加速优化,以提升PCB缺陷检测系统的实时性能。文章详细阐述了模型加速框架的选择策略(根据硬件选用TensorRT或OpenVino)、优化流程实施(包括混合精度优化和模型导出)以及加速后的推理实现。实验结果表明,优化后的模型体积缩小40%,推理速度提升2-5倍(GPU环境下从79ms降至38ms,CPU环境下从3804ms降至2152ms),同时保持检测精度。通过完整的代码示例展示了从模型加速到实际部署的全流程,为工业视觉场景

LIN943168247的博客 535

基础算法二

高精度(C++)问题: 一共考4种问题: 大整数相加 A+B A,B<=10的6次方 大整数相减 A,B<=10的6次方 大整数相乘 A<=10的6次方, a<=10的9次方 大整数相除 A<=10的6次方, a<=10的9次方 // java有大整数类,python是无限大,不需要。 大整数是很大的,用字符数组写...

qq_42403069的博客 241

华为云计算——FusionCompute创建虚拟机

华为云计算——FusionCompute创建虚拟机

jks212454的博客 3676

C++算法基础系列(二)

本文继续介绍比赛中的常用算法——二分算法。二分算法分为整数二分和浮点数二分,下文将详细介绍每一部分。

jfiehvis的博客 1175

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

基础算法(二)

上一篇:基础算法(一)         1. 冒泡排序(BubbleSort)         原理:依次比较相邻的两个数,将小数放在前面,大数放在后面。即在第一趟:首先比较第1个和第2个数,将小数放前,大数放后。然后比较第2个数和第3个数,将小数放前,大数放后,如此继续,直至比较最后两个数,将小数放前,大数放后。至此第一趟结束,将最大的数放到了最后。在第二趟:仍从第一对数开始比较(因为可能由

寻道 5013

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

【基础算法总结】二分查找二

二分查找

fight_p的博客 1323

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

车牌识别算法实践(二):基础算法

本篇将涉及到的一些基础算法集中介绍一下。由于以代码介绍为主,有些算法可能只提个名字,有些算法的原理可能会一两句话带过。 原来的VLPR工程中车牌识别的一些组件是分成好几个类的,现将它们全部塞到一个类CPlate中。这样虽有违C++ OOP的精神,但 “咣当”一下子将Plate.h复制过来感觉是很爽滴: #pragma once const int W = 512; // 预定义的归一化图像宽度 const int M = 16; // 预定义最小图像块单元的宽度 const int N

3647

基础算法(二)

对一些基础算法的总结,此系列共三章。

2302_80908249的博客 461

算法基础——图论(二)

算法基础——图论(二) 一、基础知识 1、最短路径 2、拓扑排序 3、关键路径 二、应用实例 1、畅通工程续【2008浙大研究生复试热身赛(2)——全真模拟 hdu1874】 2、最短路径问题【浙江大学】 3、最短路径【上海交通大学】 4、I Wanna Go Home【北京大学】 5、Legal or Not【HDOJ Monthly Contest – 2010.03.06 hdu 3342】 6、确定比赛名次【杭电ACM集训队训练赛(VII) hdu 1285】

Remoa的休闲茶馆 952

【算法基础二】双非本科?大一大二不敢参加蓝桥杯?

双非本科?大一大二不敢参加蓝桥杯?大胆干吧!​ ✅作者简介:大家好,我是新小白2022,让我们一起学习,共同进步吧!🏆 📃个人主页:新小白2022的优快云博客 🔥系列专栏:算法基础入门 💖如果觉得博主的文章还不错的话,请点赞👍+收藏⭐️+留言📝支持一下博主哦🤞 ​

新小白 9358

算法设计与分析——算法学基础(二):分析算法

分类目录:《算法设计与分析》总目录 分析算法的结果意味着预测算法需要的资源。虽然有时我们主要关心像内存、通信带宽或计算机硬件这类资源,但是通常我们想度量的是计算时间。一般来说,通过分析求解某个问题的几种候选算法,我们可以选出一种最有效的算法。这种分析可能指出不止一个可行的候选算法,但是在这个过程中,我们往往可以抛弃几个较差的算法。 在能够分析一个算法之前,我们必须有一个要使用的实现技术的模型,包括...

冯·诺依曼 1万+

Acwing - 算法基础课 - 笔记(基础算法 · 二)

文章目录基础算法(二)高精度高精度加法高精度减法高精度乘法高精度除法前缀差分 基础算法(二) 这节讲的是高精度,前缀,和差分。 高精度 A + B:两个大整数相加 A - B:两个大整数相减 A × b:一个大整数乘一个小整数 A ÷ b:一个大整数除以一个小整数 A × B 和 A ÷ B 见的不多,课程中没有讲。 大整数的存储:用一个数组来存大整数的每一位上的数。 这里将大整数的个位,存到数组的第一位,大整数的最高位,存到数组的最后一位,即采用小端序。 高精度加法 A + B 算法题目:Acwi

vcj1009784814的博客 1252

算法基础二 递推法

/*递推法*/ /*斐波那契数列 1 1 2 3 5 8 13..... f(n)?*/ #include using namespace std; int f1(int n) { if (n < 3)return 1; else { int t1 = 1; int t2 = 1; for (int i = 2; i < n; i++) { int temp = t1 +

上弦白月 522

【基础算法 二】查找算法

目前在剑指offer中遇到的题和常用的折半查找算法,如果再遇到再追加总结一般的折半查找算法package althorgrim; /** * 1、必须采用顺序存储结果 * 2、关键字必须有序 */ public class TestBinarySearch { public static int binarySearch(int a[],int goal){

MaoLin Tian's Blog 609

【算法设计与分析】——算法及效率分析基础(二)

算法分析框架 基本操作:它通常是算法最内层循环中最费时的操作。四则运算中:加、减、乘、除。其中最耗时的操作是除法,其次是乘法,最后是加法和减法。 问题规模:排序:数组中元素个数n. 检索:被检索数组的元素个数n. 矩阵相乘:矩阵的行列数i,j,k. 图的遍历:图的顶点数n,...

qq_40306987的博客 2203

php基础算法二

159 class iteratorTest implements Iterator160 {/*{{{*/161     private $arr = [9, 2, 20, 5, 3, 7, 4, 10, 1, 8, 6];162163     public function rewind(){164         reset($this-&gt;arr);165     }166167   ...

分享技术人生的学习笔记和过往心得,与志同道合者共同进步 224
上一篇: 算法基础一
下一篇: 算法基础三
geek-wmy
博客等级 码龄9年 322粉丝 126原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值