算法基础四

【算法学习笔记四】数学基础 一.集合、关系和函数 当分析算法时,我们认为它的输入是从某个特定范围内(如整数集合)取出的一个集合。可以认为算法是一个函数,它是一个受约束的关系,它映射每一个可能的输入到一个特定的输出,这样,集合和函数就都处于算法分析的核心中。 集合用来指任何一批对象,它们成为集合的成员或者元素。集合分为有限集合和无限集合,如果一个无限集合的元素能被一个一个列举出来,则称之为可数的,如整数集,否则不可数的,如... 阅读详情

括号生成

数字 n 代表生成括号的对数,请你设计一个函数,用于能够生成所有可能的并且 有效的 括号组合。
示例 1:

示例 1:
输入:n = 3 输出:[“((()))”,“(()())”,“(())()”,“()(())”,“()()()”]

示例 2:
输入:n = 1 输出:[“()”]

解题思路:回溯算法。这一类问题是在一棵隐式的树上求解,可以用深度优先遍历,也可以用广度优先遍历。一般用深度优先遍历。原因是:1.代码好写,使用递归的方法,直接借助系统栈完成状态的转移;2.广度优先遍历得自己编写结点类和借助队列。

   public List<String> generateParenthesis(int n) {
        List<String> res = new ArrayList<>();
        if (n == 0) {
            return res;
        }
        // 执行深度优先遍历,搜索可能的结果
        dfs("", n, n, res);
        return res;
    }


     /**
     * @param curStr 当前递归得到的结果
     * @param left   左括号还有几个可以使用
     * @param right  右括号还有几个可以使用
     * @param res    结果集
     */
    private void dfs(String curStr, int left, int right, List<String> res) {
        // 因为每一次尝试,都使用新的字符串变量,所以无需回溯
        // 在递归终止的时候,直接把它添加到结果集即可,注意与「力扣」第 46 题、第 39 题区分
        if (left == 0 && right == 0) {
            res.add(curStr);
            return;
        }

        // 剪枝(如图,左括号可以使用的个数严格大于右括号可以使用的个数,才剪枝,注意这个细节)
        if (left > right) {
            return;
        }

        if (left > 0) {
            dfs(curStr + "(", left - 1, right, res);
        }


        if (right > 0) {
            dfs(curStr + ")", left, right - 1, res);
        }
    }

合并K个升序链表

给定一个链表数组,每个链表都已经按升序排列。请将所有链表合并到一个升序链表中,返回合并后的链表。

示例 1: 输入:lists = [[1,4,5],[1,3,4],[2,6]] 输出:[1,1,2,3,4,4,5,6]
解释:链表数组如下: [ 1->4->5, 1->3->4, 2->6 ] 将它们合并到一个有序链表中得到。
1->1->2->3->4->4->5->6
示例 2: 输入:lists = [] 输出:[]
示例 3: 输入:lists = [[]] 输出:[]

解题思路:借助分治的思想,把K个有序链表两两合并即可。

 public ListNode mergeKLists(ListNode[] lists) {
        if (lists == null || lists.length == 0) {
            return null;
        }

        ListNode ans = null;
        for (int i = 0; i < lists.length; ++i) {
            ans = mergeTwoLists(ans, lists[i]);
        }
        return ans;
    }

     public ListNode mergeTwoLists(ListNode a, ListNode b) {
        if (a == null || b == null) {
            return a != null ? a : b;
        }
        ListNode head = new ListNode(0);
        ListNode tail = head, aPtr = a, bPtr = b;
        while (aPtr != null && bPtr != null) {
            if (aPtr.val < bPtr.val) {
                tail.next = aPtr;
                aPtr = aPtr.next;
            } else {
                tail.next = bPtr;
                bPtr = bPtr.next;
            }
            tail = tail.next;
        }
        tail.next = (aPtr != null ? aPtr : bPtr);
        return head.next;
    }

两两交换链表中的节点

给你一个链表,两两交换其中相邻的节点,并返回交换后链表的头节点。你必须在不修改节点内部的值的情况下完成本题(即,只能进行节点交换)。

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

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

示例 2: 输入:head = [] 输出:[]

示例 3: 输入:head = [1] 输出:[1]

  public ListNode swapPairs(ListNode head) {
        if (head == null || head.next == null) {
            return head;
        }

        ListNode next = head.next;
        head.next = swapPairs(next.next);
        next.next = head;
        return next;
    }

K个一组翻转链表

给你链表的头节点 head ,每 k 个节点一组进行翻转,请你返回修改后的链表。k 是一个正整数,它的值小于或等于链表的长度。如果节点总数不是 k 的整数倍,那么请将最后剩余的节点保持原有顺序。你不能只是单纯的改变节点内部的值,而是需要实际进行节点交换。

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

解题思路:要求k个相邻的元素翻转链表
步骤分解:

  1. 链表分区为已翻转部分+待翻转部分+未翻转部分
  2. 每次翻转前,要确定翻转链表的范围,这个必须通过 k 次循环来确定
  3. 需记录翻转链表前驱和后继,方便翻转完成后把已翻转部分和未翻转部分连接起来
  4. 初始需要两个变量 pre 和 end,pre代表待翻转链表的前驱,end 代表待翻转链表的末尾
  5. 经过k此循环,end 到达末尾,记录待翻转链表的后继 next = end.next
  6. 翻转链表,然后将三部分链表连接起来,然后重置 pre 和 end 指针,然后进入下一次循环
  7. 特殊情况,当翻转部分长度不足 k 时,在定位end 完成后,end==null,已经到达末尾,说明题目已完成,直接返回即可

 public ListNode reverseKGroup(ListNode head, int k) {
        ListNode dummy = new ListNode(0);
        dummy.next = head;

        ListNode pre = dummy;
        ListNode end = dummy;

        while (end.next != null) {
            for (int i = 0; i < k && end != null; i++) {
                end = end.next;
            }
            if (end == null) {
                break;
            }
            ListNode start = pre.next;
            ListNode next = end.next;
            end.next = null;
            pre.next = reverse(start);
            start.next = next;
            pre = start;

            end = pre;
        }
        return dummy.next;

    }

    private ListNode reverse(ListNode head) {
        ListNode pre = null;
        ListNode curr = head;
        while (curr != null) {
            ListNode next = curr.next;
            curr.next = pre;
            pre = curr;
            curr = next;
        }
        return pre;
    }

删除有序数组中的重复项

给你一个非严格递增排列的数组 nums ,请你原地删除重复出现的元素,使每个元素只出现一次 ,返回删除后数组的新长度。元素的相对顺序应该保持 一致 。然后返回nums中唯一元素的个数。
考虑 nums 的唯一元素的数量为 k ,你需要做以下事情确保你的题解可以被通过:
更改数组 nums ,使 nums 的前 k 个元素包含唯一元素,并按照它们最初在 nums 中出现的顺序排列。nums 的其余元素与 nums 的大小不重要。返回 k 。

解题思路:这里数组的删除并不是真的删除,只是将删除的元素移动到数组的后面,然后返回数组实际剩余的元素个数。


 public int removeDuplicates(int[] nums) {
        if(nums == null || nums.length == 0) {
            return 0;
        }
        int p = 0;
        int q = 1;
        while(q < nums.length) {
            if(nums[p] != nums[q]) {
                nums[p + 1] = nums[q];
                p++;
            }
            q++;
        }
        return p + 1;
    }
杂货店商品数据集挖掘关联规则实验 (2)选择事务集中前100条事务,选择合适的支持度阈值,使用Apriori算法和FP-growth算法挖掘频繁项集(推荐使用mlxtend包的apriori和fpgrowth函数),并对比apriori算法和fpgrowth算法的时间复杂度;(比如用户1000在2015年3月15日对应的事务为{‘sausage’,’whole milk’,’semi-finished bread’,’yogurt’}),然后按照用户ID递增,时间递增的方式对事务进行排序;7. 排版工整自洽,图表标题准确(10分) 阅读详情

相关推荐

C#调用Bartender打印标签,除了打印还能一键导出图片和PDF(附完整代码)

本文详细介绍了如何使用C#集成Bartender实现标签的多格式输出,包括打印、图片和PDF导出。通过完整的代码示例和实战技巧,帮助开发者解决分辨率适配、纸张尺寸控制等核心问题,提升工业自动化和物流管理中的标签处理效率。

weixin_31236101的博客 369

算法四 第一章第一节基础习题

算法四第一章基础习题我只给出了代码类的习题 1.1.3  编写一个程序,从命令行得到三个整数参数。如果它们都相等则打印 equal,否则打印 not equal。 package chapter1;import edu.princeton.cs.algs4.StdIn;//这是算法第四版这本书里面的类库 import edu.princeton.cs.algs4.StdOut;public cla

forTHQ的博客 2858

银河麒麟高级服务器操作系统V10SP2(X86)PXE无人值守批量部署实战指南

本文详细介绍了银河麒麟高级服务器操作系统V10SP2(X86)PXE无人值守批量部署的实战指南。通过PXE网络引导技术,实现全自动化、高效率的系统部署,特别适用于企业级数据中心和国产化替代项目。文章涵盖基础环境准备、关键服务配置、Kickstart高级定制及部署测试等核心内容,帮助用户快速掌握批量部署技巧。

weixin_42525637的博客 382

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

本文介绍了基础算法中的前缀和和差分,并解释了其中思想,给出了模板题帮助算法的背诵和理解。

jfiehvis的博客 998

Winform使用TreeView控件实现带复选框的三态树

刚接触c#,项目中用到Treeview实现三态,即选中、未选中、半选中状态,并且要求父子节点选择联动,效果类似下图网上有很多例子,于是研究了一下,结合网上大佬们的例子,所以在这里记录一下。首先新建一个Winform工程拖个TreeView控件,然后运行。。。嗯。。。加点数据吧。private void CreateTree() { TreeNode anime = new TreeNode...

laoyezha的博客 2万+

VGA系列之一:VGA显示网络图片

VGA系列之一:VGA显示网络图片VGA系列之一VGA显示网络图片 1 如何用FPGA实现VGA显示 2 网络图片和VGA显示有何区别 3VGA如何显示图片

善良の一休君的博客 1万+

四 基础算法模板

个人常用各种算法模板

riversu 1002

告别命令行恐惧!用TBtools的MCScanX插件,5分钟搞定拟南芥和水稻的基因组共线性分析

本文介绍如何利用TBtools的MCScanX插件快速完成拟南芥和水稻的基因组共线性分析,无需命令行操作,5分钟即可生成专业可视化结果。通过图形化界面简化传统MCScanX的复杂流程,特别适合非生物信息背景的研究者,显著提升基因组数据分析效率。

dianzhuique8587的博客 377

算法效率分析基础-算法四

主要内容: 介绍研究算法效率的通用框架 介绍三种符号: O(读作O),Ω(读作omega),和Θ(读作theta).这些数学借来的符号已经成为讨论算法效率的特定语言 使用通用框架系统对非递归算法进行分析.这种分析主要的工具是先定义一个代表算法运行时间的求和表达式,然后使用标准的求和法则对表达式进行化简 使用通用架构系统对递归算法进行分析.在这里主要分析工具不是求和,而是一种称之为递推关系的特殊等式,我们会告诉大家如何建立这种递推关系,然后对其介绍一种求解方法. 对斐波那契数列进行分析 分析框架 我们即将

weixin_43404791的博客 2880

SpringBoot 通过 JMS 集成 IBM MQ

IBM MQ 作为老牌的企业级消息中间件,虽然在当下云原生时代已不再是主流选择,但在金融、银行、保险等传统行业的核心业务系统中仍然占据着重要地位。这些行业对系统的稳定性、可靠性和事务一致性有着极高的要求,IBM MQ 正是在这些方面表现出色。尽管近年来 RabbitMQ、Apache Kafka 等新一代消息中间件在新兴项目中更受欢迎,但许多金融公司和大型企业仍在使用 IBM MQ 作为核心业务系统的消息传递基础设施。

小单的博客专栏 949

电脑技巧:Hyper-V安装UOS操作系统图文教程

今天给大家分享微软官方Hyper-v虚拟机管理软件安装UOS操作系统图文教程,感兴趣的朋友也可以下载试一试,当然有啥问题也可以互相沟通交流!

IT技术分享社区 4706

大数据 | 大数据基础--算法之亚线性时间算法:计算图的平均度算法四

亲爱的读者朋友大家晚上好,上次我们分析了计算平均度的第三个估计算法,它已经是一个近似比为的算法了。继续对此算法进行优化得到的算法四比较抽象,就不做详细的分析了,在此把过程展示给大家,有兴趣的小伙伴可以自己研究一下。详见:http://burningcloud.cn/article/123/index.html ...

陈泊舟的博客 1661

【WorkBuddy专栏52】Codex与WorkBuddy生态适配、用户争夺与未来走向(下)

【WorkBuddy专栏52】Codex与WorkBuddy在中国大陆的发展——生态适配、用户争夺与未来走向(下)

AI人人懂 678

算法基础篇:(四)基础算法之前缀和

本文详细介绍了前缀和算法的核心思想和应用。前缀和通过预处理数据,将区间查询时间复杂度从O(n)优化到O(1)。文章分别讲解了一维前缀和与二维前缀和的原理、实现步骤及注意事项,包括边界处理和常见误区,并通过"最大子段和"和"激光炸弹"两个经典例题展示其实际应用。针对大数问题和效率优化,文章建议使用long long类型存储前缀和,并提供了输入输出优化技巧。前缀和算法是基础但强大的工具,熟练掌握可为后续算法学习奠定基础。

2301_79248256的博客 1441

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

基础算法(四)

双指针 位运算 离散化 区间合并

qq_41320429的博客 220

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

【理论基础】四足机器人上层控制算法路线指南(总概)

掌握四足机器人上层控制算法需要结合理论学习和实践操作,下面是具体路径介绍。

weixin_73999150的博客 1357

jre9下载 jdk9

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

java基础四(算法)

1. 冒泡排序 2.直接选择排序 3.反转排序 1. 冒泡排序 比较相邻的元素。如果第一个比第二个大,就交换他们两个。 对每一对相邻元素作同样的工作,从开始第一对到结尾的最后一对。在这一点,最后的元素应该会是最大的数。 针对所有的元素重复以上的步骤,除了最后一个。 持续每次对越来...

Adrian 博客 523

(四)算法基础——二分算法

说起二分算法,大家可能第一时间想到的是猜数字游戏:就是猜1到100之间的一个数字,我们的最优解法是每次都猜中间,来做到不断缩小数字的准确范围,我们的二分算法也是类似的思想:在一个有序数组找特定的数,每次都缩小区间,直到找到需要找到的数。一个程序或算法的时间效率,也称“时间复杂度”,有时简称“复杂度”。 复杂度常用大的字母O和小写字母n来表示,比如O(n),O(n2 )等。n代表问题的规模,也理解为需要处理数据的量。 时间复杂度是用算法运行过程中,某种时间固定的操作需要被执行的次数和n的关系来度量的。在无序.

weixin_66578482的博客 805

算法简介及计算机算法基础——算法学习(四)

接下来的算法学习内容主要根据《程序员必读经典(算法基础+计算机系统)》一书而写,作为读书笔记,感兴趣的可以见参考文档阅读书籍详细内容。

Paul 安的博客 375

四、AcWing算法基础课

【代码】四、AcWing算法基础课。

2302_80590238的博客 203

基础算法四 - 数学基础

1. 求1 ~ n中约数的个数 2. 字符串hash P = 131 或 13331 数组int[] h, p h[i] 为字符串hash值的前缀和 h[i] = h[i - 1] * P + w.charAt(i - 1); //w.charAt(i - 1)实际上是第i个字符 p[0] = 1; p[i] = p[i - 1] * P; cong下标L到R的字符串...

weianluo的博客 263

AI基础概念之四:AI算法

AI 算法,AI模型,AI 应用三者是层层支撑、从技术到落地的关系。:是数学逻辑 / 规则(比如深度学习的 CNN、Transformer,传统机器学习的决策树、SVM),是打造模型的「施工方法」。:是算法 + 数据训练后得到的成果(一个包含海量参数的文件),是具备「智能能力」的核心实体。比如 ChatGPT 背后的 GPT-4、图像识别的 ResNet、语音识别的 Whisper,都是训练好的AI 模型;

楚來客的专栏 1295

算法基础学习——④前缀和

算法基础学习——④前缀和

VLOKL的博客 174

算法基础四:希尔排序

前面给大家介绍了算法,通过将待排序序列中的元素逐个插入到有序的子序列中,最终使整个序列变得有序。下图所示的动画演示了插入排序的整个过程:图1:插入排序算法观察动画不难发现,插入排序算法是通过比较元素大小和交换元素存储位置实现排序的,比较大小和移动元素的次数越多,算法的效率就越差。

weixin_72011965的博客 882

基础知识四、Python实现LFU算法

在第一节中实现了双向链表DoubleLinkedList类,上一节中基于双向链表实现了LRU算法,本节课我们继续基于双向链表实现LFU(Least frequently used 最不经常使用)算法。 文章目录一、重写Node节点类二、LFU实现三、测试逻辑测试结果 一、重写Node节点类 构建LFUNode类 继承自第一节中的Node类,添加freq属性用来表示节点使用频率 class LFUN...

wang_xiaowang的博客 1894

基础算法(四)

如果我们把这个区间放缩一下,并且让数组元素都为0的这个数组a作为我们的原数组,那么数组a的差分数组b也是全为0,这样我们就构成了差分数组,那么我们真正需要输入到数组中的数就可以利用二位差分的性质进行了,也就是当区间 l = r时,我们让其加上一个需要输入的数,这样既输入了数据,也构成了差分数组。当然,这两个操作返回的迭代器可能是容器的尾后迭代器。如果所查找值在容器中,lower_bound返回的迭代器将指向第一个具有给定值的元素,而upper_bound返回的迭代器指向最后一个匹配给定值的元素之后的位置。

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

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值