算法
文章平均质量分 56
Rock_N_Roll_
想成为一个摇滚文艺码农
展开
-
二进制中1的个数及其拓展
前言判断二进制中1的个数可以变形出很多道算法题,本文主要是总结位运算还有相关位运算的算法题。左移和右移对于m<<n,左移运算符对于正负数都是将最左边的n位丢弃,同时在最右边补上n个0。 如:00010101<<2 = 01010100。 而对于右移运算符,需要考虑二进制数的有无符号性。如果数字是一个无符号数,那么就用0填补最左边的n位。如果数字是一个有符号数,那么就用数字的符号位填补最左边的n位原创 2017-07-26 11:18:27 · 494 阅读 · 0 评论 -
滑动窗口变形题-最大值减去最小值小于等于num的子数组
题目:基本思想:解法1:最先想到的方法是遍历所有的子数组,然后对每一个子数组分别求出最大值和最小值,然后判断两者之差是否小于num即可。 代码如下:int getNumEnum(vector<int> arr,int num){ if(arr.empty()) return 0; int res; vector<int> tmp; for(int i原创 2017-08-17 16:28:06 · 977 阅读 · 0 评论 -
连续子数组的最大和及其拓展
题目输入一个整形数组,数组里有正数也有负数。数组中一个或连续的多个整数组成一个子数组。求所有子数组的和的最大值。要求时间复杂度为O(n).基本思想:利用动态规划求解,递归公式如下,其中f(i)表示以第i个数字结尾的子数组的最大和。公式意义如下:如果当以第i-1个数字结尾的子数组中所有数字的和小于0,则如果把这个负数与第i个数累加,则得到的结果比第i个数本身还要小,那么这时应该更新f(i)为第i个数字原创 2017-08-10 11:12:19 · 251 阅读 · 0 评论 -
由重建二叉树算法题到临时对象不能绑定到非 const 的左值引用
前言最近再刷剑指offer,在将一个临时变量传给一个引用的时候,出现了non-const lvalue reference to type 'vector<[...]>' cannot bind to a temporary of type 'vector<[...]>'的错误,意思就是不能将临时对象绑定到非const的左值的引用,那么在这里就总结一下这道算法题,const引用的用法。const总结原创 2017-07-25 20:13:15 · 953 阅读 · 0 评论 -
求最大子矩阵的大小(Maximal Rectangle)
题目:Given a 2D binary matrix filled with 0's and 1's, find the largest rectangle containing only 1's and return its area.For example, given the following matrix:1 0 1 0 01 0 1 1 11 1 1 1 11 0 0 1 0R原创 2017-08-16 23:53:58 · 6507 阅读 · 0 评论 -
顺时针打印矩阵
前言最近在刷剑指offer,碰到一道题如下:输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字,例如,如果输入如下矩阵: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 则依次打印出数字1,2,3,4,8,12,16,15,14,13,9,5,6,7,11,10.剑指offer里的解法比较难懂,但看了牛客网有人对这题的解法我觉得很棒,特此在这里分享一原创 2017-08-01 21:39:52 · 182 阅读 · 0 评论 -
从1到n整数中1出现的次数
题目:求出1~13的整数中1出现的次数,并算出100~1300的整数中1出现的次数?为此他特别数了一下1~13中包含1的数字有1、10、11、12、13因此共出现6次,但是对于后面问题他就没辙了。ACMer希望你们帮帮他,并把问题更加普遍化,可以很快的求出任意非负整数区间中1出现的次数。解法一:暴力解法: 遍历从1到n的整数,判断每个整数1的个数,再相加。时间复杂度为O(n*logn)。int N原创 2017-08-08 11:25:54 · 291 阅读 · 0 评论 -
数字追赶--搜狐笔试题
题目如下://下面的for循环分别循环了几次。1.unsigned short i,j;for(i=0, j=2; i!=j; i+=5, j+=7){}2.unsigned short i,j;for(i=3,j=7;i!=j;i+=3,j+=7){}分析: 题目1:unsigned short 可以表示为2的16次方个数,其数的范围为0到2的16次方-1,在题目1中,j比i大2,原创 2017-07-31 17:33:39 · 234 阅读 · 0 评论 -
二叉树的深度以及判断二叉树是否为平衡二叉树
二叉树的深度题目: 输入一棵二叉树,求该树的深度。从根结点到叶结点依次经过的结点(含根、叶结点)形成树的一条路径,最长路径的长度为树的深度。基本思想: 我们假定Tree的节点个数为GetTreeNodeNum(),其左子树为LeftTree,右子树为RightTree。那么求Tree的深度有以下几种情况:GetTreeNodeNum()==1&&LeftTree==NULL&&RightTre原创 2017-08-10 16:53:30 · 322 阅读 · 0 评论 -
单链表判环判相交综合题
题目给定两个单链表的头节点head1和head2,单链表可能有环,也可能无环。如何判断两个链表是否相交?相交的话返回相交的第一个节点,不想交的话返回NULL。要求:如果链表1的长度为N,链表2的长度为M,时间复杂度O(N+M),额外空间复杂度O(1)。分析:首先我们先判定两个链表是否有环,如果只有其中一个链表有环,一个链表无环,那证明这两个链表不会相交。然后再分成都有环和无环情况分别分析。都无环原创 2017-08-17 21:13:50 · 307 阅读 · 1 评论 -
数据结构-树的回顾
前言笔试当中经常会遇到关于二叉树或者其他关于树的数据结构相关的题,如最近在腾讯的笔试有一道题如下,一颗二叉树中有3个叶子结点,8个度为1的结点,求总结点的数。其实这道题很简单,如果知道在二叉树当中,只存在度为0,1,2这三种结点,且度为0的结点等于度为2的结点+1,即n0=n2+1,那这道题就是so easy了。所以基础知识在此时不言而喻,所以痛定思痛,本文总结一下有关树相关的知识点。树的一些基本概原创 2017-09-03 17:07:16 · 867 阅读 · 0 评论 -
网易笔试题-疯狂的队列
题目小易老师是非常严厉的,它会要求所有学生在进入教室前都排成一列,并且他要求学生按照身高不递减的顺序排列。有一次,n个学生在列队的时候,小易老师正好去卫生间了。学生们终于有机会反击了,于是学生们决定来一次疯狂的队列,他们定义一个队列的疯狂值为每对相邻排列学生身高差的绝对值总和。由于按照身高顺序排列的队列的疯狂值是最小的,他们当然决定按照疯狂值最大的顺序来进行列队。现在给出n个学生的身高,请计算出这些原创 2017-08-31 18:11:40 · 663 阅读 · 0 评论 -
网易笔试题-堆棋子
题目小易将n个棋子摆放在一张无限大的棋盘上。第i个棋子放在第x[i]行y[i]列。同一个格子允许放置多个棋子。每一次操作小易可以把一个棋子拿起并将其移动到原格子的上、下、左、右的任意一个格子中。小易想知道要让棋盘上出现有一个格子中至少有i(1 ≤ i ≤ n)个棋子所需要的最少操作次数.输入描述:输入包括三行,第一行一个整数n(1 ≤ n ≤ 50),表示棋子的个数第二行为n个棋子的横坐标x[i原创 2017-08-31 18:07:50 · 1171 阅读 · 0 评论 -
从递归到动态规划的代码转换之道
前言昨天看了牛客网直播–左神的算法直播,讲了啊里巴巴的编程题,并由此展开,为我们讲了如何将暴力递归的代码一步一步转换成了动态规划的代码,简直妙哉!在这里我就利用自己有限的智商总结(抄袭)下如何将递归到动态规划的代码转换之道。转换之道直接上题讲解吧!一排有N个位置,一个机器人在最开始停留在P位置,如果P==0位置,下一分钟机器人一定向右移动到1位置;如果P==N-1,下一分钟机器人一定向左移动到N-原创 2017-08-24 16:00:50 · 821 阅读 · 0 评论 -
数组中子数组等于k的最大长度
题目:假定有数组arr[4]={3,1,4,7}, 求出数组中子数组中等于12的最大长度。基本思想创建一个hash表,其key等于数组中遍历过的数的和,其value等于当前遍历的数在数组中的下标。用sum保存遍历过的数的总和,len保存最大长度;依次从数组的开头遍历,如果sum-k的值在hash表中有记录,则len更新为i-map[sum-k]和len的较大值,如果不存在就将{sum,i}加入map原创 2017-08-24 10:39:37 · 1090 阅读 · 0 评论 -
求数组中区间中最小数*区间所有数和的最大值
今日头条编程题第二道解答解法一:暴力解法穷举所有数组中所有子数组,并计算所有子数组中最小值*子数组所有数的和,求出其中的最大值即可,代码如下:int enum_method(vector<int> &num) { int n = num.size(); int maxSum = INT_MIN; vector<int> tmp; for (int i = 0; i<n原创 2017-08-23 17:06:27 · 8697 阅读 · 2 评论 -
树中两个节点最低公共祖先系列算法
前言最近刷到剑指offer 50题,树中两个结点的公共祖先,感觉这类题目对于不同性质的树会有不同的解法,而且也比较综合,在此就总结一下这类型的题目。树为二叉搜索树二叉搜索树的概念只要大家学过数据结构应该都是清楚的,也就是排序过的树。对于树上的每一个结点,其左子树的结点都小于父结点,其右子树的结点都大于父结点。那么我们解这道题的基本思想如下:1)从根结点开始遍历,让其分别和输入的两个结点做比较。 2原创 2017-09-05 10:16:24 · 588 阅读 · 0 评论 -
复制链表的复制
题目:/*struct RandomListNode { int label; struct RandomListNode *next, *random; RandomListNode(int x) : label(x), next(NULL), random(NULL) { }};*/输入一个复杂链表(每个节点中有节点值,以及两个指针,原创 2017-08-05 23:03:39 · 682 阅读 · 0 评论 -
单向链表的倒数K个节点
输入一个单向链表,输出该链表中倒数第K个节点。#include <iostream> struct ListNode//节点数据结构 { int m_nKey; ListNode* m_pNext; ListNode(const int &value):m_nKey(value),m_pNext(nullptr){}}; ListNode原创 2017-03-01 11:02:06 · 328 阅读 · 0 评论 -
包含min函数的栈
问题描述:定义栈的数据结构,请在该类型中实现一个能够得到栈的最小元素的min函数。调用min,push,及pop的时间复杂度都是O(1).解题思路:定义两个栈,一个数据栈,存放push进来的元素,另一个辅助栈,存放栈的最小元素。每次压入元素的时候,判断该元素是否与辅助栈的栈顶元素的大小关系,如果小于辅助栈栈顶元素则将其压入辅助栈,不然则压入原先最小的元素。#include <stack>#incl原创 2017-03-01 18:25:27 · 269 阅读 · 0 评论 -
最长无重复字符子串
题目:基本思想:首先设置一个hash表map <char,int> charposition存放字符串每个字符之前出现的位置和一个变量pre存放s[i-1]结尾情况下,最长的无重复子串的长度。之后不断更新这两个变量的值,更新规则如下:aPos=charposition[A[i]]+1为当前字符可能达到最长无重复子串的最远位置,即两个相同字符之间为当前可能的最长无重复子串的长度。bPos为前一个字原创 2017-06-12 22:28:31 · 238 阅读 · 0 评论 -
素数与丑数
题目1:给出n中所有素数的个数。:暴力解法每个数i都判断其是否被前面2~i的数整除,如果是不是素数,全部都不能整除,为素数。bool isPrime(int n){ if(n<2) return false; for(int i=2;i<n;i++) { if(n%i==0) return false; } return true;} 解法原创 2017-06-24 18:45:34 · 518 阅读 · 0 评论 -
树的子结构和拓扑相同的子树
之前做了剑指offer的“树的子结构”和牛客网算法课“拓扑相同的子树”,发觉这其中还是有些微妙的地方需要注意的,总结如下:树的子结构和树的子树问题:子树的意思是包含了一个结点,就得包含这个结点下的所有节点,一棵大小为n的二叉树有n个子树,就是分别以每个结点为根的子树。子结构的意思是包含了一个结点,可以只取左子树或者右子树,或者都不取。 如下图,二叉树2是二叉树1的子树也是子结构,但是二叉树3只是二原创 2017-06-11 11:25:57 · 757 阅读 · 0 评论 -
数组中重复的数字
第一类:判断数组中是否有重复值,要求空间复杂度为O(1)。基本思想:先把数组排序,设置一个int变量temp等于数组的第一个数A[0],依次遍历整个数组,如果temp不与当前遍历的数A[i]相同,这将A[i]赋值给temp,如果相同,则证明有重复值。排序复杂度为O(nlogn),空间复杂度O(1)。代码:class Checker {public: bool checkDuplicate(原创 2017-06-08 12:44:13 · 311 阅读 · 0 评论 -
小范围排序(堆排序)
题目: 已知一个几乎有序的数组,几乎有序是指,如果把数组排好顺序的话,每个元素移动的距离可以不超过k,并且k相对于数组来说比较小。请选择一个合适的排序算法针对这个数据进行排序。 给定一个int数组A,同时给定A的大小n和题意中的k,请返回排序后的数组。测试样例: [2,1,4,3,6,5,8,7,10,9],10,2 返回:[1,2,3,4,5,6,7,8,9,10]基本思想: 1. 依题原创 2017-06-07 23:45:29 · 413 阅读 · 0 评论 -
二叉搜索树的前序遍历
二叉搜索树:空树或者满足下列条件:若左子树不空,则左子树上所有结点的值都小于根节点。若右子树不空,则右子树上所有结点的值都大于根节点。为了判断一个数组是否为一棵二叉搜索树的前序遍历,主要思想为:因前序遍历第一个遍历的是根节点,则数组第一个数为根节点的值,再基于根节点把整棵树的遍历序列分成左子树和右子树序列,递归的处理这两个子序列。代码如下:#include <iostream>#includ原创 2017-03-31 17:46:59 · 1910 阅读 · 0 评论 -
链表的中间节点和判断链表是否为环形链表
基本思想:设置两个指针,都指向链表的头节点。两个指针同时从链表的头节点出发,一个指针每次走一步,另一个指针每次走两步。1.走得快的指针走到链表末尾时,走得慢的指针刚好指向链表的中间节点。2.走得快的指针如果追的上走得慢的指针,则链表为环形链表,反之不是。代码如下:#include <iostream>#include <stdexcept>using namespace std;struct原创 2017-03-29 17:09:26 · 304 阅读 · 0 评论 -
两个队列实现栈
基本思想:队列尾的元素即是栈顶元素。 push操作时,把元素全部放入队列1。 pop操作时,如果队列1的元素数量不为1,先把队列1的元素依次放入队列2,直到队列1的元素数量为1,得到队列1的头元素,即为栈顶元素。然后把队列2的元素重新放回队列1。 top操作跟pop操作类似。只是在得到队列1头元素之后把头元素放回了队列2。然后把队列2的元素重新放回队列1。#include <iostream>原创 2017-03-27 16:54:10 · 242 阅读 · 0 评论 -
循环有序数组(旋转数组)的最小值
题目:解法1:直接遍历一遍数组得出最小值,时间复杂度O(N),空间复杂度O(1)。但这个方法没有利用到旋转数组的特性。解法2:利用二分查找,时间复杂度O(logN)我们可以注意到旋转之后,以最小值为分界线,左边的数组(不包括最小值)的值总是大于右边的数据(包括最小值)。那么我们可以利用二分查找来实现最小值的查找,方法如下:定义三个指针,p1指向第一个元素,p2指向第二个元素,mid指向数组中间元素原创 2017-06-25 21:54:10 · 959 阅读 · 0 评论 -
滑动窗口的最大值
题目:有一个整型数组 arr 和一个大小为 w 的窗口从数组的最左边滑到最右边,窗口每次向右边滑一个位置。 返回一个长度为n-w+1的数组res,res[i]表示每一种窗口状态下的最大值。 以数组为[4,3,5,4,3,3,6,7],w=3为例。因为第一个窗口[4,3,5]的最大值为5,第二个窗口[3,5,4]的最大值为5,第三个窗口[5,4,3]的最大值为5。第四个窗口[4,3,3]的最大值为4。原创 2017-06-14 19:42:56 · 251 阅读 · 0 评论 -
从尾到头打印链表
问题:输入一个链表的头结点,从尾到头打印出每个结点的值。解题思路:典型的后进先出的问题。可以利用栈来实现。从头开始,每遍历一个节点,将其压入栈中,直到遍历之后,从栈顶依次输出每个结点。#include <stack>#include <stdio.h>#include <stdlib.h>struct ListNode{ int m_nValue; ListNod原创 2017-03-02 13:26:04 · 351 阅读 · 0 评论 -
二叉搜索树与双向链表的转换
题目:输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表。要求不能创建任何新的结点,只能调整树中结点指针的指向。思路:中序遍历二叉搜索树,修改当前节点与前一节点的指针指向。代码:#include <iostream>#include <stack>using namespace std;struct TreeNode { int val; struct TreeNode原创 2017-04-06 11:32:58 · 206 阅读 · 0 评论 -
二叉搜索树的第K个节点
题目:给定一棵二叉搜索树,找出其中的第K大的节点。如该二叉搜索树的第三个大节点是4。基本思路:按中序遍历算法遍历二叉搜索树,利用一个计数器边遍历边计数,知道找到第K大的节点。代码如下:class Solution { int count = 0;public: TreeNode* KthNode(TreeNode* pRoot, unsigned int k) {原创 2017-06-04 20:39:58 · 243 阅读 · 0 评论 -
堆排序总结
堆的定义:n个元素的序列{k1,k2,…,kn}当且仅当满足下列关系时,称之为堆。(1)ki<=k(2i)且ki<=k(2i+1)(1≤i≤ n/2),当然,这是小根堆,大根堆则换成>=号。//k(i)相当于二叉树的非叶子结点,K(2i)则是左子节点,k(2i+1)是右子节点堆可以看成一个完全二叉树,其所有非叶子节点的值均不大于(或不小于)其左,右孩子节点的值。主要思想:将一个无序序列(n个元素用数原创 2017-03-13 23:22:16 · 265 阅读 · 0 评论 -
排序算法总结
转载于 http://www.cnblogs.com/vinozly/p/5606132.html 各种排序算法的稳定性和时间复杂度小结 选择排序、快速排序、希尔排序、堆排序不是稳定的排序算法,冒泡排序、插入排序、归并排序和基数排序是稳定的排序算法。 冒泡法: 这是最原始,也是众所周知的最慢的算法了。他的名字的由来转载 2017-03-23 14:26:05 · 405 阅读 · 0 评论 -
Leetcode(4) Median of Two Sorted Arrays
本文章主要是对于leetcode网站的算法题目4进行总结。原题如下:There are two sorted arrays nums1 and nums2 of size m and n respectively. Find the median of the two sorted arrays. The overall run time complexity should be O(log (m+原创 2017-01-10 11:03:37 · 211 阅读 · 0 评论 -
删除链表的重复结点
题目: 在一个排序的链表中,存在重复的结点,请删除该链表中重复的结点,重复的结点不保留,返回链表头指针。 例如,链表1->2->3->3->4->4->5 处理后为 1->2->5。方法一:从头遍历整个链表,如果当前节点与下一个节点值相同,那么就把两个节点删除。为了不使链表断开,需要另外一个节点指向当前遍历节点的上一个节点(preNode),把preNode与后面不重复的第一个节点相连。代码如下:原创 2017-07-18 11:53:17 · 732 阅读 · 0 评论 -
链表中环的入口结点
题目: 一个链表中包含环,请找出该链表的环的入口结点。解法一:定义指针P1和P2指向链表的头结点。假设链表中的环有n个结点,指针P1先在链表走n步,然后两个指针已相同的速度前进。因为P1总是比P2多走n个结点,但进入环之后,当两个指针相遇时,则为环的入口结点。代码如下:class Solution {public: ListNode* EntryNodeOfLoop(ListNode*原创 2017-07-18 18:38:12 · 293 阅读 · 0 评论 -
C++ 顺序容器基础知识总结
转载自:http://www.cnblogs.com/QG-whz/p/5152963.html正文0.前言本文简单地总结了STL的顺序容器的知识点。文中并不涉及具体的实现技巧,对于细节的东西也没有提及。一来不同的标准库有着不同的实现,二来关于具体实现《STL源码剖析》已经展示得全面细致。所以本文仅仅是对容器基础知识的归纳。至于容器提供的接口与使用实例,建议查取转载 2017-09-22 15:58:39 · 500 阅读 · 0 评论