算法
文章平均质量分 52
i_am_bird
这个作者很懒,什么都没留下…
展开
-
给定一个递增排序的数组和一个数字s,求数组中和为s的俩个数。求乘积最小的俩个数
代码: vector FindNumbersWithSum(vector array,int sum) { int small=0; int big=array.size()-1; vector result; if(array.size()==0) return result; wh原创 2017-09-24 11:40:19 · 377 阅读 · 0 评论 -
给一个正整数sum,打印出所有和为sum的连续正整数序列之和。
本题的思路为:首先我们用俩个指针,samll,big,当前和为small到big的和,如果当前和大于sum则,small++,如果当前和小于sum则big++;代码: vector > FindContinuousSequence(int sum) { int big=2; int small=1; int curSum=small+b原创 2017-09-24 11:24:02 · 536 阅读 · 0 评论 -
一个整数型数组里除了俩个数字之外,其他的数字都出现俩次,求找出这俩个只出现一次的数字
思路:1 俩个相同的数字异或等于0。假设数组中只有一个只出现一次的数字,因此从头到尾依次异或数组中的每个数字,那么最终的结果就是那个只出现一次的数字。2 想办法把数组分成俩个子数组,使2个只出现一次的数字分别在两个子数组中。3 分数组,用依次异或数组中的每个数,最后的结果不为0,找出最后结果中低位最先出现1 的位置,按照数中这个位置是否为1 将数组分为俩个字数组,则数字相同的都成对出现原创 2017-09-24 09:52:22 · 360 阅读 · 0 评论 -
判断一棵二叉树是否是平衡二叉树
1 递归 bool IsBalanced_Solution(TreeNode* pRoot) { if(pRoot==NULL) return true; int left=TreeDepth(pRoot->left); int right=TreeDepth(pRoot->right); int d原创 2017-09-23 10:42:15 · 171 阅读 · 0 评论 -
求二叉树的深度
1 递归 int TreeDepth(TreeNode* pRoot){ if(pRoot == NULL){ return 0; } int left = TreeDepth(pRoot->left); int right = TreeDepth(pRoot->right); ret原创 2017-09-23 10:34:38 · 187 阅读 · 0 评论 -
在一个排序数组中求一个数K出现的次数
思路:1 因为数组是有序的,因此可以遍历数组,遇到比K大的数就终止,时间复杂度O(n) int GetNumberOfK(vector data ,int k) { int count=0; for(int i=0;i<data.size();i++){ if(data[i]==k){ cou原创 2017-09-23 09:09:59 · 650 阅读 · 0 评论 -
在字符串中找出第一个只出现一次的字符
传统思路 就是遍历字符串,访问某个字符时和后面的每个字符对比,如果没有重复就返回,如果有就向后遍历;这种时间复杂度为O(n*n);空间O(1);新颖: 利用哈希表,把字符串的ASCII码作为Key,在字符串出现的次数作为value 然后遍历两次字符串即可得到结果;代码: int FirstNotRepeatingChar(string str) { if(s原创 2017-09-22 10:03:56 · 772 阅读 · 0 评论 -
丑数,即只有2,3,5因子的整数,找出第n 个丑数
1 直观版 int GetUglyNumber_Solution(int index) { if(index return 0; int number=0; while(index>0){ number++; if(isUglyNumber(number))原创 2017-09-22 09:29:42 · 751 阅读 · 0 评论 -
找出两个链表的第一个公共节点
思路:两个链表的第一个公共节点即同一个节点,因为链表的遍历都是从头开始,因此如果两个链表的长度相等,只要同步遍历即可得到第一个共同节点;代码如下: ListNode* FindFirstCommonNode( ListNode* pHead1, ListNode* pHead2) { if(pHead1==NULL || pHead2==NULL)原创 2017-09-22 11:21:10 · 317 阅读 · 0 评论 -
求数组中,子数组合的最大值
可以考虑动态规划,如当前和小于等于0,则下一个数从新开始计算,保存当前的最大值。int FindGreatestSumOfSubArray(vectorint> array) { if(array.empty())return 0; intsum = array[0], tempsum = array[0]; //注意初始值 不能设为0 防止原创 2017-09-21 10:28:34 · 590 阅读 · 0 评论 -
将二叉树转换为排序双向链表
对二叉树进行中序遍历,得到一个排序的序列,然后调整树节点的指针即可得到版本1 非递归: TreeNode* Convert(TreeNode* pRootOfTree) { if(pRootOfTree==NULL) return NULL; stack stackTree; TreeNode原创 2017-09-20 09:35:48 · 491 阅读 · 0 评论 -
对输入的字符串按字典顺序输出所有的全排列,字符串可以由重复字符
思路: 1、把字符串看成俩部分,第一个字符和后面的整个快; 2.、每次把第一个字符和后面的一个交换, 3,固定第一个字符然后对后面的字符块进行全排列 4、对后面字符串的全排列可以依旧这样递归 void PermutationHelp(vector &ans, int k, string str) //遍历第k位的所有可能 { if(k == s原创 2017-09-20 10:49:06 · 6301 阅读 · 0 评论 -
求n个数中最小的K个数。
思路一:如果可以改变原数组,则可利用快排的思想。1 先用Partition将数组分为俩部分然后比较与K-1的大小2 若大于k-1 则调整尾端,,若小于k-1,则调整头端,再利用partition直到返回等于k-1。代码: vector GetLeastNumbers_Solution(vector input, int k) { vector result;原创 2017-09-21 09:26:57 · 459 阅读 · 0 评论 -
对整数数组里所有的数字拼接起来,输出最小的一个
思路:把整数转换为字符串,然后对字符串数组进行排序,然后输出字符串用JAVA 比较方便import java.util.ArrayList;import java.util.Collections;import java.util.Comparator; public class Solution { public String PrintMinNumber(原创 2017-09-21 11:18:06 · 1927 阅读 · 0 评论 -
将字符串循环左移n位
思路1: 1 现将前n位反转,再将(n,len)位反转,最后再把整个字符串翻转即可 string LeftRotateString(string str, int n) { if(n==0||str.size()==0) return str; int length=str.size()-1; int begin原创 2017-09-25 09:43:51 · 2322 阅读 · 1 评论 -
求一副扑克牌的顺子,大小王记为0,可以充当任意数字
要判断是否顺子,的满足俩个要求。 1:没有对子,即重复的数字 2 :最大和最小值相差不超过4,缺失数字的个数比0的个数等于或少于;即先对数组排序,然后在统计其中0的个数;最后算差值。代码: bool IsContinuous( vector numbers ) { int length=numbers.size(); if(length原创 2017-09-25 10:40:08 · 1230 阅读 · 0 评论 -
0到n-1排成一个环,从数字0开始数,删除第m个数字,球最后的一个数。
约瑟夫环问题: int LastRemaining_Solution(int n, int m) { if(n<1||m<1) return -1; list numbers; for(int i=0;i<n;i++){ numbers.push_back(i); }原创 2017-09-25 11:19:03 · 494 阅读 · 0 评论 -
在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。
bool Find(int target, vector > array){ int row=array.size(); int col=array[0].size(); int i=0; int j=col-1; while(i=0){ if(array[i][j]>target){原创 2017-09-25 12:02:50 · 2132 阅读 · 0 评论 -
求俩个数的和,要求不能用加减乘除四则运算。
本题源自剑指offer------------------------------------------------------------------------------ 既然不能用四则运算,因此我们就想用位运算来求解。 1 我们先对数进行异或,(不考虑进位) 2 然后为俩个数进行与运算,再左移一位,(考虑进位) 3对前面的运算结果相加,即重复前俩步直到与运算的转载 2017-09-26 09:39:02 · 379 阅读 · 0 评论 -
求1+2+3+...+n,不能利用乘除法,以及for,while,if,else;
思路:1 这种题一般用循环和递归来求解,现在不让用for,if 就是禁止使用循环和递归。因此考的是发散思维。 2 利用构造函数求解class Solution {public: Solution(){ ++N; sum+=N; } static void reset(){ N=0;转载 2017-09-26 09:10:23 · 280 阅读 · 0 评论 -
将一个字符串转换为一个整数,若遇到非数字字符则返回0
本题源自剑指offer代码为自己编写-------------------------------------没考虑溢出 int StrToInt(string str) { if(str.size()==0) return 0; int i=0; int flag=0; if(str[转载 2017-09-26 10:04:41 · 839 阅读 · 0 评论 -
在一个长度为n的数组里的所有数字都在0到n-1的范围内。 数组中某些数字是重复的,但不知道有几个数字是重复的。也不知道每个数字重复几次。请找出数组中任意一个重复的数字。 例如,如果输入长度为7的数组{
本题源自剑指offer----------------------------------------------------------------------------------------1 找出数组中重复的数字可以将数组排序,然后遍历数组就可以找到。时间复杂度为O(nlogn); 2 也可以利用O(n)的哈希表将数组映射,找出重复的数字,时间复杂度O(n),空间复杂度O(n转载 2017-09-26 10:46:21 · 2912 阅读 · 0 评论 -
给定一个数组A[0,1,...,n-1],请构建一个数组B[0,1,...,n-1],其中B中的元素B[i]=A[0]*A[1]*...*A[i-1]*A[i+1]*...*A[n-1]。不能使用除法
分别算A[i] 的左侧与右侧;代码: vector multiply(const vector& A) { vector B(A.size()); if(A.size()==0) return B; int ret=1; //计算左侧 for(int i=0;i<A.size();转载 2017-09-26 12:02:23 · 2236 阅读 · 0 评论 -
请实现一个函数用来匹配包括'.'和'*'的正则表达式。模式中的字符'.'表示任意一个字符,而'*'表示它前面的字符可以出现任意次(包含0次)。 在本题中,匹配是指字符串的所有字符匹配整个模式。例如,字
本题源自剑指offer-----------------------------------------------------------------------------------如果模式串遇到*字符则有两种状态,第一匹配字符,则字符串后移一位,模式串不变,第二,模式串后移俩位和字符串后移一位,第三,忽略星号。 bool match(char* str, char* pa原创 2017-09-27 09:29:47 · 1794 阅读 · 0 评论 -
实现一个函数用来判断字符串是否表示数值(包括整数和小数)。例如,字符串"+100","5e2","-123","3.1416"和"-1E-16"都表示数值。
本题源自剑指Offer--------------------------------------------------------------------------- bool isNumeric(char* string) { if(string==NULL) return false; if(*string==原创 2017-09-27 10:12:58 · 494 阅读 · 0 评论 -
实现一个函数用来找出字符流中第一个只出现一次的字符。
本题源自剑指offer---------------------------------------------------------------用哈希表,键值为字符的ASSCI码 值为字符在字符流中的下标 int hash[256]; int index; Solution(){ for(int i=0;i<256;i++)原创 2017-09-27 10:49:11 · 594 阅读 · 0 评论 -
一个链表中包含环,请找出该链表的环的入口结点
本题源自剑指offer--------------------------------------------------------1用俩个指针,遍历链表快指针和慢指针必定在环内相遇,然后可以让一个指针从头开始遍历,一个指针在相遇点遍历,俩个指针重合就是环的入口,2也可以在相遇点求出环结点的个数,然后都头链表头开始遍历,让其中一个指针先走环节点步,第二个指针在出发。ListNod原创 2017-09-27 11:22:15 · 225 阅读 · 0 评论 -
删除链表中重复的节点。
本题源自剑指offer--------------------------------------------------------------------------------------要删除重复的节点,既要保留重复节点的前一个节点和后一个节点,然后让前一个节点指向后一个节点。 ListNode* deleteDuplication(ListNode* pHead)原创 2017-09-28 09:08:36 · 166 阅读 · 0 评论 -
给定一个二叉树和其中的一个节点,求中序遍历这个节点的下一个节点
本题源自剑指offer------------------------------------------------------------------------------------------------------中序遍历的下一个节点有三种情况 1 当这个节点右子树不为空,则下一个节点为右子树的最左子节点 2 若右子树为空,且节点为父节点的左子树,则下一个节点为原创 2017-09-28 09:48:08 · 1032 阅读 · 0 评论 -
判断一颗二叉树是否为对称二叉树
本题源自剑指offer-----------------------------------------------------------------------可以自定以一种对称前序遍历,即先遍历父节点,再访问右子节点,在访问左子节点,NULL节点也访问,将得到的序列和前序遍历比较,相同就说明二叉树是对称的。递归: bool isSymmetrical(TreeNode*原创 2017-09-28 10:01:15 · 576 阅读 · 0 评论 -
按照之字形打印二叉树的节点
本题源自剑指offer----------------------------------------------------------------用俩个栈,当前打印层为奇数层时,就先让左子节点进栈再进右子节点;若当前打印层为偶数,则先让右子节点进栈再进左子节点 vector > Print(TreeNode* pRoot) { vector > result;原创 2017-09-28 10:41:02 · 176 阅读 · 0 评论 -
将二叉树打印成多行
本题源自剑指offer-------------------------------------------------按层打印二叉树用队列,在用俩个变量,一个记录本层未打印的节点数,另一个记录下一层的节点的数量。 vector > Print(TreeNode* pRoot) { vector >result; if(pRoot=原创 2017-09-28 10:50:53 · 160 阅读 · 0 评论 -
有N个孩子站在一条线上。 每个孩子都被分配一个评分值。你给这些孩子,每个孩子必须至少有一个糖果具有较高评级的儿童比邻居获得更多的糖果。 你必须给予的最低
本题源自LeetCode--------------------------------------------------------------------贪心算法1 初始化给每个孩纸一个糖果 2 从左向右扫描如果评分比前面的高 就比前面的糖果加13 从右向左扫描与 如果比前面的评分低,糖果比前面的多,就把前面的糖果变为后面的加1 int candy(vec原创 2017-10-07 09:12:55 · 2629 阅读 · 0 评论 -
沿着循环路线有N个加油站,其中i站的天然气量是[i]。你有一辆带有无限气罐的汽车,并且它的费用是从i站到我的下一站(i + 1).如果您可以绕电路行驶一次,则返回起始站索引
本题源自LeetCode=--------------------------------------------------------------------------------------1 定一个起始站start2 如果油量充足就向前走 end++ 否则就倒退一站。3 记录每站的消耗,不浪费已经遍历过的从尾开始 int canCompleteCi原创 2017-10-07 09:44:52 · 995 阅读 · 0 评论 -
序列化和反序列化二叉树
本题源自剑指offer---------------------------------------------------char* Serialize(TreeNode *root) { if(root == NULL) return NULL; string str; Serialize(root, str);原创 2017-09-29 09:28:44 · 159 阅读 · 0 评论 -
求二叉搜索树的第k个节点
本题源自剑指offer-----------------------------------------------------------------------------用中序遍历二叉搜索树得到有序数列,即可得到第k个数递归: TreeNode* KthNode(TreeNode* pRoot, int k) { if(pRoot==NULL |原创 2017-09-29 09:54:38 · 155 阅读 · 0 评论 -
求一个数据流的中位数
本题源自剑指offer----------------------------------------------------------------------用两个堆来解决这个问题 1用最大堆存储左半部分的数,用最小堆存储有半部分的数据,若有奇位个数,中位数就是最小堆的堆顶,否则为最大堆和最小堆堆顶的平均数。如果当前数据流中的数为偶数个,则新数据插入最小堆,否则插入最大堆。保证最小原创 2017-09-29 10:26:55 · 426 阅读 · 0 评论 -
复制无向图,用邻接表结构
本题源自LeetCode---------------------------------------------------------------------------------1 广度优先遍历 用队列2 用一个map存储节点与复制节点的对应,避免重复复制UndirectedGraphNode *cloneGraph(UndirectedGraphNode *node)原创 2017-10-07 10:14:46 · 239 阅读 · 0 评论 -
将一个字符串s 切割成子串都是回文,最小的切割次数
本题源自LeetCode---------------------------------------------------------------------------------------用动态规划的思想1 用一个dp数组来存储子串(0,i)的最小切割次数,则最优解在dp[str.length()-1].2 如果当前子串是回文则dp[i]=0;否则dp[i]=i;3原创 2017-10-07 11:04:54 · 2427 阅读 · 0 评论 -
给定一个字符串s,求子串都是回文的集合。
1 用递归的思想 遍历划分子串,判断是否为回文 vector> partition(string s) { vector > result; vector path; partitionCore(s,result,path); return result; } void partitionCore(st原创 2017-10-08 08:58:58 · 1481 阅读 · 0 评论