算法基础十二

C++基础(十二)——标准库算法 STL算法和容器之间不是强绑定的——算法并不知道操作的具体是什么容器,它只通过迭代器来跟数据打交道。这种解耦设计就像是一位经验丰富的搬家师傅:他不需要认识你家里的每一个人(不需要了解容器的内部类型),只需要按照门牌号清单(迭代器范围)搬运物品。这就让同一个算法(比如sort)可以同时服务于vector、deque、原始数组,甚至任何自定义的可迭代类型。所有的STL算法都以迭代器对[begin, end)作为输入,表示一个“左闭右开”的范围。 阅读详情

删除排序链表中的重复元素2

给定一个已排序的链表的头 head , 删除原始链表中所有重复数字的节点,只留下不同的数字 。返回 已排序的链表 。

示例 1:
输入:head = [1,2,3,3,4,4,5] 输出:[1,2,5]
示例 2:
输入:head = [1,1,1,2,3] 输出:[2,3]


  public ListNode deleteDuplicates(ListNode head) {
        if (head == null) {
            return head;
        }

        ListNode dummy = new ListNode(0, head);

        ListNode cur = dummy;
        while(cur.next != null && cur.next.next != null) {
            if (cur.next.val == cur.next.next.val) {
                int x = cur.next.val;
                while(cur.next != null && cur.next.val == x) {
                    cur.next = cur.next.next;
                }
            } else {
                cur = cur.next;
            }
        }

        return dummy.next;
    }

分隔链表

给你一个链表的头节点 head 和一个特定值 x ,请你对链表进行分隔,使得所有 小于 x 的节点都出现在 大于或等于 x 的节点之前。

示例 1:
输入:head = [1,4,3,2,5,2], x = 3 输出:[1,2,2,4,3,5]
示例 2:
输入:head = [2,1], x = 2 输出:[1,2]

解题思路:双向链表

 public ListNode partition(ListNode head, int x) {
        ListNode small = new ListNode(0);
        ListNode smallHead = small;

        ListNode large = new ListNode(0);
        ListNode largeHead = large;

        while(head != null) {
            if (head.val < x) {
                small.next = head;
                small = small.next;
            } else {
                large.next = head;
                large = large.next;
            }
            head = head.next;
        }

        large.next = null;
        small.next = largeHead.next;
        return smallHead.next;
    }

子集2

给你一个整数数组 nums ,其中可能包含重复元素,请你返回该数组所有可能的子集(幂集)。
解集 不能 包含重复的子集。返回的解集中,子集可以按 任意顺序 排列。

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

解题思路:DFS



    List<Integer> t = new ArrayList<>();
    List<List<Integer>> ans = new ArrayList<>();

    public List<List<Integer>> subsetsWithDup(int[] nums) {
        Arrays.sort(nums);
        int len = nums.length;

        for(int mask = 0; mask < (1 << len); ++mask) {
            t.clear();
            boolean flag = true;

            for(int i = 0; i < len; ++i) {
                if((mask & (1 << i)) != 0) {
                    if (i > 0 && (mask >> (i - 1) & 1) == 0 && nums[i] == nums[i - 1]) {
                        flag = false;
                        break;
                    }
                    t.add(nums[i]);
                }
            }

            if (flag) {
                ans.add(new ArrayList<>(t));
            }
        }

        return ans;
    }

反转链表2

给你单链表的头指针 head 和两个整数left和right ,其中 left <= right 。请你反转从位置 left 到位置 right 的链表节点,返回 反转后的链表 。

示例 1:
输入:head = [1,2,3,4,5], left = 2, right = 4 输出:[1,4,3,2,5]
示例 2:
输入:head = [5], left = 1, right = 1 输出:[5]


  public ListNode reverseBetween(ListNode head, int left, int right) {
        // 因为头节点有可能发生变化,使用虚拟头节点可以避免复杂的分类讨论
        ListNode dummyNode = new ListNode(-1);
        dummyNode.next = head;

        ListNode pre = dummyNode;
        // 第 1 步:从虚拟头节点走 left - 1 步,来到 left 节点的前一个节点
        // 建议写在 for 循环里,语义清晰
        for (int i = 0; i < left - 1; i++) {
            pre = pre.next;
        }

        // 第 2 步:从 pre 再走 right - left + 1 步,来到 right 节点
        ListNode rightNode = pre;
        for (int i = 0; i < right - left + 1; i++) {
            rightNode = rightNode.next;
        }

        // 第 3 步:切断出一个子链表(截取链表)
        ListNode leftNode = pre.next;
        ListNode curr = rightNode.next;

        // 注意:切断链接
        pre.next = null;
        rightNode.next = null;

        // 第 4 步:同第 206 题,反转链表的子区间
        reverseLinkedList(leftNode);

        // 第 5 步:接回到原来的链表中
        pre.next = rightNode;
        leftNode.next = curr;
        return dummyNode.next;
    }

    private void reverseLinkedList(ListNode head) {
        // 也可以使用递归反转一个链表
        ListNode pre = null;
        ListNode cur = head;

        while (cur != null) {
            ListNode next = cur.next;
            cur.next = pre;
            pre = cur;
            cur = next;
        }
    }

复原IP地址

有效 IP 地址 正好由四个整数(每个整数位于 0 到 255 之间组成,且不能含有前导 0),整数之间用 ‘.’ 分隔。
例如:“0.1.2.201” 和 “192.168.1.1” 是 有效 IP 地址,但是 “0.011.255.245”、“192.168.1.312” 和 “192.168@1.1” 是 无效 IP 地址。
给定一个只包含数字的字符串 s ,用以表示一个 IP 地址,返回所有可能的有效 IP 地址,这些地址可以通过在 s 中插入 ‘.’ 来形成。你 不能 重新排序或删除 s 中的任何数字。你可以按 任何 顺序返回答案。

示例 1:
输入:s = “25525511135” 输出:[“255.255.11.135”,“255.255.111.35”]
示例 2:
输入:s = “0000” 输出:[“0.0.0.0”]
示例 3:
输入:s = “101023”
输出:[“1.0.10.23”,“1.0.102.3”,“10.1.0.23”,“10.10.2.3”,“101.0.2.3”]



    public List<String> restoreIpAddresses(String s) {
        int len = s.length();

        List<String> res = new ArrayList<>();
        if (len > 12 || len < 4) {
            return res;
        }

        Deque<String> path = new ArrayDeque<>(4);
        dfs(s, len, 0, 4, path, res);

        return res;
    }

    private void dfs(String s, int len, int begin, int residue, Deque<String> path, List<String> res) {
        if (begin == len) {
            if (residue == 0) {
                res.add(String.join(".", path));
            }
            return;
        }

        for (int i = begin; i < begin + 3; i++) {
            if (i >= len) {
                break;
            }

            if (residue * 3 < len - i) {
                continue;
            }

            if (judgeIpSegment(s, begin, i)) {
                String currentIpSegment = s.substring(begin, i + 1);
                path.addLast(currentIpSegment);

                dfs(s, len, i + 1, residue - 1, path, res);

                path.removeLast();
            }
        }
    }

    private boolean judgeIpSegment(String s, int left, int right) {
        int len = right - left + 1;
        if (len > 1 && s.charAt(left) == '0' ) {
            return false;
        }

        int res = 0;
        while(left <= right) {
            res = res * 10 + s.charAt(left) - '0';
            left++;
        }

        return res >= 0 && res <= 255;
    }



AHB总线协议 1. 简介         AHB总线规范是AMBA总线规范的一部分,AMBA总线规范是ARM公司提出的总线规范,被大多数SoC设计采用,它规定了AHB (Advanced High-performance Bus)、ASB (Advanced System Bus)、APB (Advanced Peripheral Bus)。AHB用于高性能、高时钟频率的系统结构,典型的应用如ARM核与系统内 阅读详情

相关推荐

实战复盘:如何用Frida脚本绕过某书APP的libmsaoaidsec.so检测(附完整Hook代码)

本文深入探讨了如何利用Frida脚本绕过某书APP通过libmsaoaidsec.so实现的反Frida检测机制。通过分析动态链接过程中的关键节点和检测模式,提供了两种实战验证的绕过方案:动态Hook关键链接器函数和静态Patch SO文件。文章还分享了进阶对抗策略和调试技巧,帮助安全研究人员有效应对现代移动安全防护挑战。

weixin_42706667的博客 218

(十二)基础算法

一些简单的算法

2401_85898378的博客 2339

AI 小说生成器本地部署完全指南

这篇文章介绍了本地部署AI小说生成器的完整指南,主要面向网文作者、内容创作者和AI爱好者。文章从环境搭建到创作实践,详细讲解了三种主流部署方案:Ollama(推荐新手)、LMStudio(图形界面)和text-generation-webui(高级定制)。内容涵盖硬件需求、系统架构、模型选择、API对接、提示词工程等关键技术环节,并提供了小说创作的特制提示词模板和参数调优建议。文章还讨论了长篇小说管理、多模型协作等进阶技巧,以及版权伦理等法律问题。最后推荐了相关工具资源和社区论坛,帮助读者实现安全、高效、可

珂珂可爱多 2242

算法设计与分析基础(十二)

算法设计与分析基础(十二):动态规划 目录算法设计与分析基础(十二):动态规划适用条件计算二项式系数背包问题数学模型贪心法动态规划Warshall算法 与 Floyd算法Warshall算法Floyd算法最优二叉查找树思考题 动态规划比较难掌握,所以不做深入学习,只讲部分内容! 重点必须掌握的是:Warshall算法 与 Floyd算法!!!!! 适用条件 最优化原理(最优子结构性质) 一个最优化策略的子策略总是最优的。一个问题满足最优化原理又称其具有最优子结构性质,使我们可以自底向上的方式从子问题

BKSW.的博客 1478

SAP高级外币评估_FINS_FXV_S4 2022 OP

摘要:S/4HANA 2022 On-Premise中的高级外币评估(FINS_FXV)取代了经典外币估值(FAGL_FCV),提供更优化的财务结算功能。主要创新包括:增量发布逻辑、简化账户配置、行项目级估值可见性等。该功能支持IFRS9等会计准则,通过会计原则(Accounting Principle)进行配置,需完成财务报表版本定义、语义标记分配等必要设置。系统演示展示了从汇率维护(FB60/MIRO)、测试运行到最终过账(FB03)的完整流程,能自动计算并过账汇率差异。高级外币评估简化了期末结算操作,

yanzibing99的博客 1258

红火蚁巢穴AI智能识别,提供方案与思路!

🏆本文收录于 《全栈 Bug 调优(实战版)》 专栏。专栏聚焦真实项目中的各类疑难 Bug,从成因剖析 → 排查路径 → 解决方案 → 预防优化全链路拆解,形成一套可复用、可沉淀的实战知识体系。无论你是初入职场的开发者,还是负责复杂项目的资深工程师,都可以在这里构建一套属于自己的「问题诊断与性能调优」方法论,助你稳步进阶、放大技术价值 。

**My Coding Family** 1041

算法修炼入门指南:从数据结构到基础算法的二十二层体系构建

数据结构与算法是计算机科学的核心基础,它们共同构成了高效解决复杂问题的理论框架。数据结构如数组、链表、栈、队列和哈希表,负责数据的组织与存储,而算法思想如递归、分治、排序和查找,则定义了处理数据的逻辑步骤。掌握这些基础能显著提升代码效率与系统性能,是进行系统设计、优化和通过技术面试的基石。在实际开发中,无论是构建高并发服务、实现快速检索,还是优化数据处理流程,都离不开扎实的算法内功。本文以“练气二十二层”为隐喻,系统梳理了从变量、流程控制到二叉树、堆等核心内容的渐进式学习路径,并融入递归、动态规划等高频技术

weixin_30621711的博客 680

YOLOv8改进策略【卷积层】| DEConv: 强度信息与梯度特征融合的细节增强 适用于小目标与细节目标检测任务

本文记录的是利用 模块优化 的目标检测网络模型。(Detail-Enhanced Convolution,细节增强卷积)的设计旨在,解决 目标检测网络中传统普通卷积缺乏目标细节相关先验、对小目标边缘、目标与背景边界等关键细节捕捉能力不足的问题,同时避免引入额外参数量与计算开销,以适配 对实时推理性能与检测精度的双重需求。DEA-Net: Single image dehazing based on detail-enhanced convolution and content-guided atte

Limiiiing的博客 348

八字易经算法之用JAVA实现通勝十二建择日算法

一直上网发现有人求万年历上吉凶日/择日算法或者源代码,更有此类软件竟要收费几十元。   我上网查找半天也没有具体原理的文章。   作为易学高手的我(大师♂罗莊)对告诉各位码农如何制作吉凶日/择日算法  负有不可推卸的责任。   今天开的课程就是通勝十二建择日算法    /* * 简单的通勝十二建选择日子实现 *@author luozhuang 大师♂罗莊 */ package

大师的资源 7277

从0到全栈:C#/.NET/.NET Core终极学习路线——2025年开发者必修的12个阶段与30个实战项目

【代码】从0到全栈:C#/.NET/.NET Core终极学习路线——2024年开发者必修的12个阶段与30个实战项目。

墨夶的博客 2042

ubuntu 安装node和npm

在ubuntu中经常需要用到node ,npm,因为npm基本会和node同时安装,所以只需要安装node即可。可以使用 nvm(Node Version Manager)来管理你的 Node.js 版本。

风吹落叶的博客 2291

浅谈算法和数据结构: 十二 无向图相关算法基础

从这篇文章开始介绍图相关的算法,这也是Algorithms在线课程第二部分的第一次课程笔记。 图的应用很广泛,也有很多非常有用的算法,当然也有很多待解决的问题,根据性质,图可以分为无向图和有向图。本文先介绍无向图,后文再介绍有向图。 之所以要研究图,是因为图在生活中应用比较广泛: 无向图 图是若干个顶点(Vertices)和边(Edges)相互连接组成的。边仅由两个

1089

基于STM32、HAL库的AD7124-8BCPZ模数转换器ADC驱动程序设计

/ 配置0: 使用内部参考电压(2.5V),增益128,双极性。// 配置通道0: AIN0+和AIN1-,使用配置0和滤波器0。// 100ms采样间隔。// 转换为电压值(使用内部2.5V参考电压)// 构造读命令: 最高位为1表示读,接下来7位是寄存器地址。// 构造写命令: 最高位为0表示写,接下来7位是寄存器地址。// 配置滤波器0: 输出数据率50Hz,后置滤波器4。

corlin6688的博客 528

机器学习——基础算法(十二)

机器学习——基础算法(十二) 一、相对熵 二、互信息 三、信息增益 四、概率 五、贝叶斯公式的应用 六、后验概率 七、贝叶斯网络 八、贝叶斯网络的三个定理 ...

qq_41511262的博客 183

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

【基础算法】(04) 十二种排序算法(第四篇)

本系列总结了常用的十二种排序算法,其中本文是排序算法系列的第三篇,介绍了 '桶排序', '计数排序', '基数排序' 三种排序算法。

西海 Tech 407

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

算法刷题记录 八十二【图论理论基础及深度优先搜索算法】

图论开篇及深度优先搜索算法

danaaaa的博客 1857

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

左程云算法基础班整理(十二)(c++版)

基础班十二

weixin_44683202的博客 423

算法基础篇:(十二)基础算法之倍增思想:从快速幂到大数据运算优化

摘要:本文深入探讨了倍增思想在算法中的应用,通过二进制分解和分步处理将时间复杂度从O(n)优化到O(logn)。重点讲解了快速幂算法(a^b mod p)和大整数乘法取模(a×b mod p)的实现原理与C++代码,包括递归和迭代两种版本。文章还介绍了倍增思想在RMQ、LCA等高级场景的应用,并提供了处理数据溢出的"快速乘"优化方案。通过数学原理、案例分析和代码实现,帮助读者掌握这一高效算法思想,适用于处理10^18级别的大数据运算。

2301_79248256的博客 2162

【基础算法】(02) 十二种排序算法(第二篇)

本系列总结了常用的十二种排序算法,其中本文是排序算法系列的第二篇,介绍了 '简单选择排序', '堆排序', '冒泡排序', '鸡尾酒排序/双向冒泡排序' 四种排序方法。

西海 Tech 418

算法基础期末考点总结十二——二叉搜索树

从这章开始,变得难了起来。 性质 首先介绍二叉搜索树是什么。二叉搜索树首先是棵树,又因为是二叉树,所以一个节点至多有两个儿子,再因为是搜索树,要方便搜索,所以人为规定,搜索树上节点的左子树所有点小于节点,右子树所有点大于节点。 算法 如果你要重头自己写一个二叉搜索树算法的话,接下来介绍的顺序便是写代码的顺序。 中序遍历 图论教过,不再赘述。 递归查找 三种情况:找到了,在左子树,在右子树。 非递归查找 大大减少空间复杂度。 找最大值 利用的二叉搜索树的性质。 找最小值 找后继 3种情况: 1.x

weixin_43416013的博客 171

【密码学——基础理论与应用】李子臣编著 第十二章 SM3密码杂凑算法 课后习题

【密码学——基础理论与应用】李子臣编著 第十二章 SM3密码杂凑算法 课后习题

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

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值