算法基础三

AcWing基础算法(三) AcWing基础算法(三) 最长连续不重复子序列 题目 给定一个长度为 n 的整数序列,请找出最长的不包含重复的数的连续区间,输出它的长度。 输入格式 第一行包含整数 n。 第二行包含 n 个整数(均在 0∼105 范围内),表示整数序列。 输出格式 共一行,包含一个整数,表示最长的不包含重复的数的连续区间的长度。 数据范围 1≤n≤105 输入样例: 5 1 2 2 3 5 输出样例: 3 思路 可以先用暴力的思想用两个for循环来做,但是这就不是我们算法要学习的了。 我们的算法是借鉴暴力的思想而 阅读详情

电话号码的字母组合

给定一个仅包含数字 2-9 的字符串,返回所有它能表示的字母组合。答案可以按 任意顺序 返回。给出数字到字母的映射如下(与电话按键相同)。注意 1 不对应任何字母。
在这里插入图片描述

示例 1:
输入:digits = "23"
输出:["ad","ae","af","bd","be","bf","cd","ce","cf"]

示例 2:
输入:digits = ""
输出:[]

示例 3:
输入:digits = "2"
输出:["a","b","c"]


    //一个映射表,第二个位置是"abc“,第三个位置是"def"
	//这里也可以用map,用数组可以更节省点内存
	String[] letter_map = {" ","*","abc","def","ghi","jkl","mno","pqrs","tuv","wxyz"};

    public List<String> letterCombinations(String digits) {
	//注意边界条件
		if(digits==null || digits.length()==0) {
			return new ArrayList<>();
		}
		iterStr(digits, new StringBuilder(), 0);
		return res;
    }

    	//最终输出结果的list
	List<String> res = new ArrayList<>();
	

    //递归函数
	void iterStr(String str, StringBuilder letter, int index) {
		//递归的终止条件,注意这里的终止条件看上去跟动态演示图有些不同,主要是做了点优化
		//动态图中是每次截取字符串的一部分,"234",变成"23",再变成"3",最后变成"",这样性能不佳
		//而用index记录每次遍历到字符串的位置,这样性能更好
		if(index == str.length()) {
			res.add(letter.toString());
			return;
		}

		//获取index位置的字符,假设输入的字符是"234"
		//第一次递归时index为0所以c=2,第二次index为1所以c=3,第三次c=4
		//subString每次都会生成新的字符串,而index则是取当前的一个字符,所以效率更高一点
		char c = str.charAt(index);
		//map_string的下表是从0开始一直到9, c-'0'就可以取到相对的数组下标位置
		//比如c=2时候,2-'0',获取下标为2,letter_map[2]就是"abc"
		int pos = c - '0';
		String map_string = letter_map[pos];
		//遍历字符串,比如第一次得到的是2,页就是遍历"abc"
		for(int i=0;i<map_string.length();i++) {
			//调用下一层递归,用文字很难描述,请配合动态图理解
            letter.append(map_string.charAt(i));
            //如果是String类型做拼接效率会比较低
			//iterStr(str, letter+map_string.charAt(i), index+1);
            iterStr(str, letter, index+1);
            letter.deleteCharAt(letter.length()-1);
		}
	}

四数之和

给你一个由 n 个整数组成的数组 nums ,和一个目标值 target 。请你找出并返回满足下述全部条件且不重复的四元组 [nums[a], nums[b], nums[c], nums[d]] (若两个四元组元素一一对应,则认为两个四元组重复):
0 <= a, b, c, d < n
a、b、c 和 d 互不相同
nums[a] + nums[b] + nums[c] + nums[d] == target

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

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

解题思路:用map提前计算好3数之和,可以将时间复杂度降到O(n^3),最主要一点是最后输出结果不能重复,思路跟三数之和完全一致。


   public List<List<Integer>> fourSum(int[] nums, int target) {
        List<List<Integer>> quadruplets = new ArrayList<List<Integer>>();
        if (nums == null || nums.length < 4) {
            // 数组为空或者长度不够4直接返回空
            return quadruplets;
        }

        // 先排序,解决可能输出重复结果问题
        // [-2, -1, 0, 0, 1, 2]
        Arrays.sort(nums);

        int len = nums.length;
        for(int i = 0; i < len - 3; i++) {
            if (i > 0 && nums[i] == nums[i - 1]) {
                continue;
            }

            if(nums[i] + nums[i + 1] + nums[i + 2] + nums[i + 3] > target) {
                break;
            }

            if(nums[i] + nums[len - 3] + nums[len - 2] + nums[len - 1] < target) {
                continue;
            }

            for (int j = i + 1; j < len - 2; j++) {
                if (j > i + 1 && nums[j] == nums[j - 1]) {
                    continue;
                }

                if (nums[i] + nums[j] + nums[j + 1] + nums[j + 2] > target) {
                    break;
                }

                if (nums[i] + nums[j] + nums[len - 2] + nums[len - 1] < target) {
                    continue;
                }

                int left = j + 1;
                int right = len - 1;
                while(left < right) {
                    int sum = nums[i] + nums[j] + nums[left] + nums[right];
                    if (sum == target) {
                        quadruplets.add(Arrays.asList(nums[i], nums[j], nums[left], nums[right]));
                        while (left < right && nums[left] == nums[left + 1]) {
                            left++;
                        }
                        left++;
                        while (left < right && nums[right] == nums[right - 1]) {
                            right--;
                        }
                        right--;
                    } else if (sum < target) {
                        left++;
                    } else {
                        right--;
                    }
                }
            }
        }
        return quadruplets;
    }

删除链表的倒数第N个节点

给你一个链表,删除链表的倒数第 n 个结点,并且返回链表的头结点。

示例 1:
在这里插入图片描述
输入:head = [1,2,3,4,5], n = 2 输出:[1,2,3,5]
示例 2:
输入:head = [1], n = 1 输出:[]
示例 3:
输入:head = [1,2], n = 1 输出:[1]

解题思路:先循环一次拿到链表总长度,然后循环到要删除节点的前一个节点开始操作删除。
这里有两种解法,第一就是根据链表长度,遍历拿到要删除元素的前一个元素;第二个就是通过栈的方式,先把所有元素压入栈中,然后根据要删除的元素下标遍历栈取出前一个元素。

    public ListNode removeNthFromEnd(ListNode head, int n) {
        ListNode dummy = new ListNode(0, head);
        // 计算出链表长度
        int length = 0;
        while (head != null) {
            ++length;
            head = head.next;
        }
        // 拿到要删除元素的前一个元素
        ListNode cur = dummy;
        for (int i = 1; i < length - n + 1; ++i) {
            cur = cur.next;
        }
        // 进行删除操作,改变指针引用
        cur.next = cur.next.next;
        ListNode ans = dummy.next;
        return ans;
    }

有效括号

给定一个只包括 ‘(’,‘)’,‘{’,‘}’,‘[’,‘]’ 的字符串 s ,判断字符串是否有效。
有效字符串需满足:

  1. 左括号必须用相同类型的右括号闭合。
  2. 左括号必须以正确的顺序闭合。
  3. 每个右括号都有一个对应的相同类型的左括号。

示例 1:
输入:s = “()” 输出:true
示例 2:
输入:s = “()[]{}” 输出:true
示例 3:
输入:s = “(]” 输出:false

解题思路:遇到左括号就push到栈,遇到右括号并且栈顶为对应的左括号就把元素出栈,最后看栈中是否还有元素。

  private static final Map<Character,Character> map = new HashMap<Character,Character>(){{
        put('{','}'); put('[',']'); put('(',')'); put('?','?');
    }};

    public boolean isValid(String s) {
        // 首先判断是否包含左括号
        if(s.length() > 0 && !map.containsKey(s.charAt(0))) {
            return false;
        }

        LinkedList<Character> stack = new LinkedList<Character>() {{ 
            add('?'); 
        }};
        
        // 遍历每个元素
        for(Character c : s.toCharArray()) {
            if(map.containsKey(c)) {
                // 匹配到左括号入栈
                stack.addLast(c);
            } else if (map.get(stack.removeLast()) != c) {
                // 再判断是否是对称
                return false;
            }
        }
        return stack.size() == 1;
    }

合并两个有序链表

将两个升序链表合并为一个新的 升序 链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。

示例 1:
在这里插入图片描述

输入:l1 = [1,2,4], l2 = [1,3,4] 输出:[1,1,2,3,4,4]
示例 2:
输入:l1 = [], l2 = [] 输出:[]
示例 3:
输入:l1 = [], l2 = [0] 输出:[0]


 public ListNode mergeTwoLists(ListNode list1, ListNode list2) {
        if (list1 == null) {
            return list2;
        } else if (list2 == null) {
            return list1;
        }

        // 如果链表1的值小于链表2,再根据小的元素的下一个节点去比较
        if (list1.val < list2.val) {
            list1.next = mergeTwoLists(list1.next, list2);
            return list1;
        } else {
            list2.next = mergeTwoLists(list1, list2.next);
            return list2;
        }
    }
张量网络算法基础(三、格点模型) 格点模型格点模型1. 热力学基础经典热力学基础量子格点模型的热力学基础2. 海森堡模型的基态计算量子格点模型的基态问题基态计算的退火算法基态计算的严格对角化算法基于自动微分的基态变分算法 格点模型 1. 热力学基础 经典热力学基础 对于一个粒子构成的系统,该系统处于某一种状态(记为s1,s2,…{{s}_{1}},{{s}_{2,\ldots }}s1​,s2,…​)的概率 P 由该状态的能量E决定,满足P(s1,s2,…;β)=e−βE(s1,s2,…)ZP({{s}_{1}},{{s}_{2}},\ 阅读详情

相关推荐

【教程】BM1684X-32边缘计算盒子 网络配置教程

BM1684X边缘计算盒子网络配置教程

ShiMetaPi的博客 714

【算法基础三】算法如何入门?零基础入门算法应该学些什么?

算法如何入门以及零基础入门算法应该学些什么?​ ✅作者简介:大家好,我是新小白2022,让我们一起学习,共同进步吧!🏆 📃个人主页:新小白2022的优快云博客 🔥系列专栏:算法基础入门 💖如果觉得博主的文章还不错的话,请点赞👍+收藏⭐️+留言📝支持一下博主哦🤞 ​...

新小白 1万+

【技术解析】华为智算中心:昇腾AI算力与无损网络如何驱动大模型训练

本文深入解析了华为智算中心如何通过昇腾AI算力与超融合以太无损网络的协同,驱动千亿参数大模型的高效训练。昇腾NPU提供专用计算引擎,而基于RoCE的无损网络则通过PFC、ECN等技术确保万卡集群间的高带宽、零丢包通信,实现算力利用率最大化,解决大规模AI训练的核心瓶颈。

weixin_29311017的博客 192

【一对一小组】2024年有三AI-CV初阶-基础算法组发布,如何夯实深度学习图像识别算法理论基础与实践...

2024年有三AI-CV初阶-基础算法组正式发布!有三AI已经推出了CV初-中-高级培养计划(原名有三AI-CV季划),这是我们的终身计算机视觉学习小组。该培养计划具有以下特点:【系统性】配套有非常完备的理论与实践【永久性】不限制学习期限,一直有效【成长性】内容保持更新,不额外收费【专业性】原创书+视频讲解+真实项目锻炼【丰富性】数千页PPT,文档,项目等【权威性】工业界资深背景辅导老师,弱运营属...

hacker_long的专栏 1805

vCenter Server出现no healthy upstream的解决方法

可以通过"VMware vCenter Server Management(服务)"来排查问题,在网页里面找到“服务”模块,会发现有很多服务没有启动起来,而且手动启动也无法启动。7.0 地址后,页面出现“no healthy upstream”,无法正常登录vCenter,重启后依旧如此,该故障的前提是没有对vCenter做过任何配置,如下图所示。于是用命令查询是否有证书过期,发现真有多个服务依赖的证书在当天早上过期。使用如下命令尝试打开服务发现不分服务可以打开,不分服务无法打开。

1万+

(R,线性回归)R语言里的模型诊断图(Residuals vs Fitted,Normal QQ , Scale-Location ,Residuals Leverage)

线性回归,是概率统计学里最重要的统计方法,也是机器学习中一类非常重要的算法。线性模型简单理解非常容易,但是内涵是非常深奥的。尤其是线性回归模型中的Diagnostics plot的阅读与理解一直被认为是线性回归中的一个难点。 在任何线性模型中,能够直接“lm”(模型有意义),既要考虑各个参数的t-test所得出的p-value,也要考虑总体模型F-检验得出的p-value。在这之后,还要清楚一个...

qq_35837578的博客 7万+

[AcWing算法基础课] Chapter1 基础算法(三)

双指针算法 我们在快速排序和归并排序里就已经用到双指针算法了。 第一类:第一个指针指向序列1,第二个指针指向序列2 第二类:两个指针指向同一个序列 for(int i=0,j=0;i<n;i++){ while(j<i && check(i,j)) j++; //每道题目的具体逻辑 } 核心思想:将朴素算法优化到O(n) 问题1:有一个形如abc def hij的字符串,请输出每个单词(不含空格),每个单词占一行。 #include <iostream>

maets906的博客 489

RDkit入门

今天开始写RDkit的入门教程,每天学习和写一小点,相信一句话“不积跬步无以至千里,不积小流无以成江海”,所以就慢慢来,一点一滴积累叭,从最简单的开始喽希望自己每天都能保持写博客的好习惯,把自己的代码笔记就极在这里,RDkit一块啃了很久的骨头,今天终于要下定决心,好好总结一波了,希望保持这个更新的频率,每天都能有所学。............

博客而已 6682

(三)视觉处理算法基础

目录   1、图像滤波与卷积(滤波与去噪) 2、图像边缘检测 3、直方图与阈值分割 4、图像特征描述 5、再论图像分割 6、综合示例 1、图像滤波与卷积(滤波与去噪)     图像平滑---平均滤波、加权平均滤波     中值滤波、图像形态学基本操作---膨胀、腐蚀     图像形态学操作---开闭运算、OpenCV实现 2、图像边缘检测     边缘检测--...

fly_Xiaoma的博客 5337

RH850系列芯片深度剖析 1.5-链接(ld)文件解析

基础编译过程分为四个阶段:预处理(Preprocessing)、编译(Compilation)、汇编(Assembly)、链接(Linking)。执行这四个阶段的程序(预处理器、编译器、汇编器、和链接器)一起构成了编译系统。CONSTANTS接下来的内存空间定义部分会使用这些常量来定义内存空间的范围,理论上来说不定义常量也没有影响,直接用魔鬼数字代替,定义常量的主要目的就是方便理解以及方便修改;从示例中可以看出,常量的值可以为16进制或者10十进制,而且10进制支持数量级单位(k级,M级);

本博客专注于嵌入式软件领域技术分享。 1427

【ChatGPT】实用 Prompt 指令大全 —— 一文教你如何更好地挖掘 GPT 的价值

ChatGPT 是由 OpenAI 开发的一种先进的大型语言生成模型,能够理解和生成准确、自然且连贯的文本。文本生成数据分析内容审核语义理解自然语言推理以及其他众多任务ChatGPT是一种基于GPT-3.5架构的大型语言模型,由OpenAI公司开发。该模型在自然语言处理领域有着广泛的应用,可以用于文本生成、文本分类、情感分析、问答系统等任务。本文将从模型的架构、训练方式、优缺点等方面对ChatGPT进行详细介绍。一、模型架构。

AI天才研究院 2万+

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

文章目录基础算法(三)双指针小结位运算离散化区间合并 基础算法(三) 这节讲的是双指针算法,位运算,离散化,区间合并 双指针 2个指针指向不同的序列 比如归并排序 2个指针指向同一个序列 比如快速排序 对于形如 for(int i = 0; i < n; i++) { for(int j = 0; j < n; j++) { } } 这一类的双层循环,可能可以使用双指针来进行优化,从而能够把时间复杂度从O(n2)降低到O(n),比如求一个数组中最长

vcj1009784814的博客 1803

mbed驱动st7789屏幕-硬件选择及连接(1)

在单片机项目中,交互性至关重要,而视觉感知是用户交互的直接体现。本期专栏介绍了如何使用mbed平台驱动ST7789型号的TFT屏幕,以显示字符、汉字和图像。由于针对STM32L432KC的mbed驱动库尚未完整,作者自行编写了一个基于mbed的ST7789屏幕驱动库,并将在专栏中提供全代码及使用指南。

weixin_64524066的博客 391

[Acwing] 算法基础课总结 三 搜索与图论

目录1.DFS 1.DFS 842.排列数字 对于每个节点,只能选择没有用过的数,因此需要一个st[]st[]st[] 数组,当我们枚举到底层的时候,需要清空状态 void dfs(int u){ if( u == n+1){ for(int i = 1;i<=n;i++) cout<<ans[i]<<" "; cout<<endl; return; } for(int i=1;i<=n;i++){ if(!st[i]

qq_34364611的博客 533

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

算法设计与分析基础(三)

算法设计与分析基础(三) 练习题 根据下列函数的增长次数按照从低到高的顺序对他们进行排序。 解答: 解答: 即,该多项式的始终值为ak*n^k,则结论成立。 考虑下面的算法: 算法Mystery(m) //输入:非负整数n S←0 for i←1 to n do S←S+i* i return S a.该算法求的是什么? 求的是1到n的平方和 b.它的基本操作是什么? 基本操作是:乘法 (或者,假定乘法和加法的时间相同,两者中的任何一个) c.该基本操作执行了多少次? n次

BKSW.的博客 5889

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

基础算法三 - 搜索与图论

这里写自定义目录标题欢迎使用Markdown编辑器新的改变功能快捷键合理的创建标题,有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants创建一个自定义列表如何创建一个注脚注释也是必不可少的KaTeX数学公式新的甘特图功能,丰富你的文章UML 图表FLowchart流程图导出与导入导出导入 欢迎使用Ma...

weianluo的博客 550

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

三、AcWing算法基础课

一条路走到黑,如果走不下去了/走完了就回溯再继续走。每次找下一步能到的一圈,一直到走到目的点。

2302_80590238的博客 142

【华科算法基础】三.分治法

目录分治算法可用分治法求解的特征分治法求解三步骤二分检索找最大/最小元素基于分治的分类算法选择问题 分治算法 基本思想 将一个难以直接解决的、规模较大问题,分割成若干个规模较小、相对容易解决的、但性质相同的子问题,然后分别解决这些子问题。在获得这些较小子问题的解之后,再将子问题的解合并成原始问题的解。 分治策略的抽象化控制过程——二分策略 可用分治法求解的特征 1) 问题可以分解为若干个规...

weixin_44225940的博客 670

【一对一小组】2025年有三AI-CV初阶-基础算法组发布,助力夯实深度学习图像识别算法理论与实践...

2025年有三AI-CV初阶-基础算法组正式发布!有三AI已经推出了CV初-中-高级培养计划(原名有三AI-CV季划),这是我们的终身计算机视觉学习小组。该培养计划具有以下特点:【系统性】配套有非常完备的理论与实践【永久性】不限制学习期限,一直有效【成长性】内容保持更新,不额外收费【专业性】原创书+视频讲解+真实项目锻炼【丰富性】数千页PPT,文档,项目等【权威性】工业界资深背景辅导老师,弱运营属...

hacker_long的专栏 1819

基础算法(三)

基础算法

weixin_64443786的博客 261

基础算法(三)STL

提供一种方法,使之能够依序寻访某个容器所含的各个元素,而又无需暴露该容器的内部表示方式。非质变算法:是指运算过程中不会更改区间内的元素内容,例如查找、计数、遍历、寻找极值等等。有限的步聚,解决逻辑或数学上的问题,这一门学科我们叫做算法(Algorithms)质变算法:是指运算过程中会更改区间内的元素的内容。算法:各种常用的算法,如sort、find、copy、for_each等。常用的数据结构:数组,链表,树,栈,队列,集合,映射表等。:理调值的排序,序列式容器中的每个元素均有固定的位置。

qq_73920552的博客 608

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

本文主要介绍比赛中的高精度算法,包括加减乘除四种不同运算。由于python和JAVA各自的特点,故这一部分仅C++语言需要掌握。

jfiehvis的博客 1046

基础算法(三)

本节课有归并排序与二分查找的内容,因为前面已经学习过了,不再进行总结。

lkdzyrsh的博客 111

一.基础算法(三)

双指针是一种常见的算法,可以针对单一序列使用(快速排序),以维持区间内某种规则;也可以针对2个序列使用,以保证某种次序(归并排序)。双指针算法可以从暴力算法()通过使用某种规则到复杂度。基本应用:输出单词(输入包含空格)1.算法思想:设置指针i,j,i负责向后遍历,j负责寻找单词的末尾,因此一个单词就是i到j之间的部分,再令i移动到下一个单词的位置2.代码实现思路:当j不为空格时,就让j向后移动,循环结束时j指向空格,此时输出(j,i)就是该单词,再令i等于j,就使得i移动到下一个单词的位置。

2403_87058898的博客 412
上一篇: 算法基础二
下一篇: 算法基础四
geek-wmy
博客等级 码龄9年 322粉丝 126原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值