![](https://img-blog.csdnimg.cn/20201014180756913.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
算法
windyear
这个作者很懒,什么都没留下…
展开
-
算法第四版书的C++版本代码
最近在看算法第四版,书中使用的是JAVA来实现,因为本人主用语言是C++ ,并且想学得更好一点,于是将书中的例子用C++重写了一遍,主要的数据结构使用了STL的容器。代码中带有本人的一些注释和C++语言更JAVA不同出有部分改动。下面的是github地址。现在差不多写好了第四章,其他的有待慢慢加上。https://github.com/windyear/AlgorithmsAndDataStruc...原创 2018-03-05 17:20:36 · 4899 阅读 · 1 评论 -
leetcode之删除链表中给定值的节点
题目删除链表中等于给定值 val 的所有节点。示例:输入: 1->2->6->3->4->5->6, val = 6;输出: 1->2->3->4->5分析比较简单,直接遍历一遍链表,将值相等的删除即可。删除时要保留前一个节点的指针,直接指向下一个节点。重点注意的地方是,如果从头节点开始就是要删除的节点,会使得算...原创 2018-06-27 16:18:22 · 369 阅读 · 0 评论 -
leetcode之删除链表中重复的元素
题目给定一个排序链表,删除所有重复的元素,使得每个元素只出现一次。输入: 1->1->2;输出: 1->2分析题目比较简单,直接遍历一次即可。使用两个指针,如果后一个节点的值和前面一个相等,删除后面的一个节点。注意传入的头结点为空或者只有一个元素的情况。代码/** * Definition for singly-linked list...原创 2018-06-27 16:18:41 · 893 阅读 · 0 评论 -
leetcode之两种方法反转链表
题目反转一个单链表。可以迭代或递归地反转链表。示例:输入: 1->2->3->4->5->NULL;输出: 5->4->3->2->1->NULL。分析迭代的方法可以从头开始遍历,每次将一个指向反转。在草稿纸上画出草图,很明显需要三个临时指针。反转后所有指针向后移动一步。知道最后一个指针指向空。最后更新一下最后一个...原创 2018-06-27 20:41:23 · 5126 阅读 · 0 评论 -
leetcode169之寻找绝对众数
题目给出一串数字,求出其中的众数的值,保证输入的数字数组拥有绝对众数。绝对众数是指超过总的数字个数的一半的数字。分析这道题被归到分治算法当中去,应当使用分解为不同过得子问题的问题。想了很久无法拆出子问题来求解。无法利用超过一半数量的数字这个条件。后来直接使用了map去统计数字的个数的方法。直到找到超多一半数量的数字返回。还有一个方法是直接排序,然后找到其中中间的数字。...原创 2018-07-10 15:27:44 · 305 阅读 · 0 评论 -
leetcode53之最大连续子数组和
题目给定一个整数数组 nums ,找到一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和。输入: [-2,1,-3,4,-1,2,1,-5,4];输出: 6;解释: 连续子数组 [4,-1,2,1] 的和最大,为 6。尽量实现复杂度为O(n)的算法,还可以采用分治的方法。分析这道题第一个想法是直接暴力求解。三重循环,但是时间复杂度太高了。分治的方法在算法...原创 2018-07-11 10:09:47 · 2185 阅读 · 0 评论 -
leetcode142之寻找环形链表的环的起点
题目给定一个链表,返回链表开始入环的第一个节点。 如果链表无环,则返回 null。说明:不允许修改给定的链表。尽量不用额外的存储空间分析这个跟寻找环的题目相似,但是难度增加了。花费了较多时间去做。肯定是利用快慢指针找出是否存在环。画图之后发现,慢指针走的步数是环的长度。所以,只要另一个指针从开头出发,慢指针继续向前走,他们碰到的节点就是环的入口。第一版的代码还用了一个...原创 2018-07-05 22:40:05 · 899 阅读 · 0 评论 -
编程笔试题之句子反转
题目给定一个句子(只包含字母和空格), 将句子中的单词位置反转,单词用空格分割, 单词之间只有一个空格,前后没有空格。 比如: (1) “hello xiao mi”-> “mi xiao hello”。输入数据有多组,每组占一行,包含一个句子(句子长度小于1000个字符)。对于每个测试示例,要求输出句子中单词反转后形成的句子分析反转想到使用栈,然后就是解决存储单词...原创 2018-08-19 22:25:16 · 474 阅读 · 0 评论 -
编程笔试题值求数列的和
题目数列的第一项为n,以后各项为前一项的平方根,求数列的前m项的和。分析题目没有难度,调用库函数sqrt求出平方根,然后控制输出的精度需要设置。代码#include <cmath>#include <iostream>using namespace std;int main(){ double n, m; cout....原创 2018-09-09 22:35:59 · 709 阅读 · 0 评论 -
编程笔试题之求水仙花数
题目春天是鲜花的季节,水仙花就是其中最迷人的代表,数学上有个水仙花数,他是这样定义的: “水仙花数”是指一个三位数,它的各位数字的立方和等于其本身,比如:153=1^3+5^3+3^3。 现在要求输出所有在m和n范围内的水仙花数。分析没有什么难度,暴力求解即可。注意格式的控制。本次采取一个vector记录数字,最后再调输出格式。代码#include <iost...原创 2018-09-09 22:37:03 · 3050 阅读 · 0 评论 -
leetcode之删除倒数第N个节点
题目给定一个链表,删除链表的倒数第 n 个节点,并且返回链表的头结点。给定一个链表: 1->2->3->4->5, 和 n = 2。当删除了倒数第二个节点后,链表变为 1->2->3->5。你能尝试使用一趟扫描实现吗?分析使用一遍扫描实现,需要计算倒数。很明显是使用快慢指针的问题。快指针先走N步,然后一起走,到达最后的时候就能找...原创 2018-07-01 19:52:57 · 242 阅读 · 0 评论 -
leetcode之删除重复的有序链表的节点
题目给定一个排序链表,删除所有含有重复数字的节点,只保留原始链表中 没有重复出现 的数字。输入: 1->2->3->3->4->4->5:输出: 1->2->5。分析这个删除重复链表的题目跟之前的不同,要把重复的元素全部删除。遍历链表可以删除重复多余的链表,但是会剩下一个。问题的关键在于怎样把有重复的最后一个节点删除。可添加...原创 2018-07-01 17:13:03 · 942 阅读 · 0 评论 -
一道关于整数变换次数笔试题
题目描述:输入一个整数,将它的没一位分别相乘得到一个新的数,直到该数字为1位数。求要做多少次变换。思路该题目很明显给出了这个计算过程,每次都将每一位相乘,之后判断是否达到一位数这个要求。所以问题的关键在于如何将一个多位数字的每一位逐一提取出来。使用对10的取余可以获得各位数字。而对10取模每次都可以将位数降一位。所以整个计算过程包括两个嵌套起来的循环。代码展示u...原创 2018-03-25 16:08:20 · 301 阅读 · 0 评论 -
小谈插入排序
小谈插入排序插入排序是常见的排序方式之一,时间复杂度为O(n^2)。它是一种原址性的排序方法,只需要额外的一点空间存储中间变量。比较节省空间,在输入规模不大的时候不失为一种好的排序方法。主要思路如下:从第二个元素开始,逐个与前面的元素比较以找到合适的插入位置,不符合大小关系的往后移动一位,直到找到正确的位置为止。代码如下:#include <stdio.h>int...原创 2018-03-25 15:56:10 · 160 阅读 · 0 评论 -
leetcode_两整数之和
题目给定一个整数数组和一个目标值,找出数组中和为目标值的两个数。 可以假设每个输入只对应一种答案,且同样的元素不能被重复利用。示例:给定 nums = [2, 7, 11, 15], target = 9,因为 nums[0] + nums[1] = 2 + 7 = 9,所以返回 [0, 1]思路分析一个马上想到的思路是遍历所有整数的两两组合,直到和为目标值。可用二重循环...原创 2018-06-21 15:46:43 · 378 阅读 · 0 评论 -
leetcode之两数相加
题目描述给定两个非空链表来表示两个非负整数。位数按照逆序方式存储,它们的每个节点只存储单个数字。将两数相加返回一个新的链表。 你可以假设除了数字 0 之外,这两个数字都不会以零开头。示例:输入:(2 -&gt; 4 -&gt; 3) + (5 -&gt; 6 -&gt; 4);输出:7 -&gt; 0 -&gt; 8;原因:342 + 465 = 807。思路很容易想到按...原创 2018-06-21 22:18:51 · 184 阅读 · 0 评论 -
leetcode之合并有序链表
题目将两个有序链表合并为一个新的有序链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。示例:输入:1->2->4, 1->3->4;输出:1->1->2->3->4->4分析思路比较简单,直接遍历两个链表,知道两个到达结尾。每次合并一个节点。值得注意的是两个链表结束的时间不同,所以先判断是否有一个链表已经到达...原创 2018-06-22 22:57:29 · 118 阅读 · 0 评论 -
leetcode之环形链表
题目描述给定一个链表,判断链表中是否有环。不用额外空间。题目分析可以使用快慢指针,快指针比满指针快一步,如果有环就一定可以追上。如果到达了空指针,说明没有环。注意比较相等的时候要比较指针相等,不是节点的值相等。代码/** * Definition for singly-linked list. * struct ListNode { * in...原创 2018-06-23 20:29:58 · 456 阅读 · 0 评论 -
leetcode之删除链表的节点
题目只给出一个节点信息,删除该节点。链表至少包含两个节点。 链表中所有节点的值都是唯一的。 给定的节点为非末尾节点并且一定是链表中的一个有效节点。 不要从你的函数中返回任何结果。思路这道题要比较巧妙的思路,一开始的时候没有想到。因为链表是不能向前走的,所以不能找到前面一个节点。那么应该如何删除当前的节点呢?其实可以理解链表的节点只是值不同,值替换了其实链表的节点的顺序也...原创 2018-06-23 21:13:56 · 141 阅读 · 0 评论 -
leetcode之找出相交链表的交点
题目编写一个程序,找到两个单链表相交的起始节点。如果相交只会是y型相交,如果不想交就返回空指针。O(1)空间和O(n)时间分析直接采取暴力二重循环可以求解,但是超过时间限制。一个思路是先找出两个链表长度相差的值,然后一个链表先走相差的步数,如果相交,可以找到相交的节点。还有一个方法是建立hash表,但是超出存储的限制了。一种比较巧妙的方法是人工构建环,如果从A的尾部...原创 2018-06-29 21:41:11 · 476 阅读 · 0 评论 -
leetcode之回文链表
题目请判断一个链表是否为回文链表。输入: 1->2->2->1;输出: true分析第一时间想到的是利用栈,额外的存储空间保存前面一半的节点值,然后跟后一半比较是否相等即可。还有一个方法是翻转一半的链表。由于单向链表不能反向搜索,所以经常应用快慢指针。比如用快慢指针找到一半的位置。代码/** * Definition for sin...原创 2018-06-30 10:44:48 · 514 阅读 · 0 评论 -
Leetcode208 Trie 实现前缀树
Leetcode208 Trie 实现前缀树题目实现一个 Trie (前缀树),包含 insert, search, 和 startsWith 这三个操作。分析字典树关键在于节点的结构的设定。利用字符串的公共前缀节省空间。节点结构应该需要一个节点指针数组代表路径。一个变量记录是否是叶子。拓展增加数量的记录,需要增加经过该节点的字符串数量和以其为结尾的数量。节点结构如下...原创 2019-02-12 21:27:15 · 305 阅读 · 0 评论