Math
豆芽炒粉丝
世上万事,不过一拖二闹三不读书。
展开
-
动态规划(Dynamic Programming)学习笔记记录
要了解DP,需要知道递归的知识和基本的暴力搜索。定义:本质:递归原问题(N)->子问题(N-1)->原问题(N)最优子结构子问题最优决策可导出原问题最优决策 无后效性重叠子问题去冗余 空间换时间(注意分析时空复杂度)基本步骤: 四个步骤设计暴力算法,找到冗余 设计并存储状态(一维,二维,三维数组,甚至用Map) 递归式(状态转移方程) 自底向上计算最优解(编程方原创 2016-09-14 19:23:13 · 1748 阅读 · 0 评论 -
LeetCode-Number of 1 Bits
Write a function that takes an unsigned integer and returns the number of ’1’ bits it has (also known as the Hamming weight). For example, the 32-bit integer ’11’ has binary representation 00000000000原创 2016-10-13 09:02:42 · 318 阅读 · 0 评论 -
Leetcode 326 : Power of Three
Given an integer, write a function to determine if it is a power of three.确定这个数是不是3的幂对于确定一个数n是不是k幂而言,有如下方法:只需求得在int允许的最大范围的k为底的最大的数p,如果这个最大的p能被n整除,那么就为k幂例如:确定一个数n是不是3的幂,在整型范围内可以先求3为底的最大的数,记为p,如果p%n==0,原创 2016-10-13 08:49:06 · 339 阅读 · 0 评论 -
LeetCode 371:Sum of Two Integers
LeetCode 371:Sum of Two IntegersCalculate the sum of two integers a and b, but you are not allowed to use the operator + and -加法(a + b)用^、&和<<即可实现,a^b可得到对应位没有进位时的和,a&b可得到各位产生的进位值。如:a=010010, b=100111,计原创 2016-10-07 10:30:52 · 364 阅读 · 0 评论 -
LeetCode 144: Binary Tree Preorder Traversal
Q: Given a binary tree, return the preorder traversal of its nodes’ values.前序遍历: 根左右/** * Definition for a binary tree node. * public class TreeNode { * int val; * TreeNode left; * Tr原创 2016-10-03 10:58:13 · 360 阅读 · 0 评论 -
Leetcode 14 : Longest Common Prefix
Q:Write a function to find the longest common prefix string amongst an array of strings.分析: 一个字符数组的最长公共前序。例如”abcdsa”,”a”,”abcjd”的公共前序就是”a”,不难见得,最长公共前序是由最短的字符串来决定的,那么可以如下的一种思路: 1.求得前两个字符串的公共前序,存为ans原创 2016-09-29 08:10:45 · 355 阅读 · 0 评论 -
LeetCode 72 Edit Distance DP解法思路记录
leetcode 72 Edit Distance 给定两个字符串,寻找最小的操作数,使得word1变为word2. 1.可以插入字符 2.可以删除字符 3.可以替换字符 对于上面的讲解如下: 1.对应位置相同则不去扣分即不进行任何操作,不同则扣一分(需要修改) 2.两个特殊字符”-“不会对应的意思是,可以反过来理解,如果两个特殊字符对应,那么特殊字符的位置不可能是在字符之间,原创 2016-09-17 21:39:36 · 763 阅读 · 0 评论 -
LeetCode473: Matchsticks to Square
public class Solution { //sums是当前每个边的大小 index是在数组中的位置 average是每个边的长度 public boolean robot(int[] nums, int [] sums , int index, int average){ //边界条件 if(nums.length3 || index>num原创 2016-12-24 10:17:58 · 1157 阅读 · 3 评论 -
LeetCode105: Construct Binary Tree from Preorder and Inorder Traversal
与题目106类似: 从前序遍历,与中序遍历中还原二叉树。 假设树: 通过先序遍历找到第一个点作为根节点,在中序遍历中找到根节点并记录index。 因为中序遍历中根节点左边为左子树,所以可以记录左子树的长度(index-in_left),并在先序遍历中依据这个长度找到左子树的区间,用同样方法可以找到右子树的区间。 递归的建立好左子树和右子树即可。 public c原创 2016-12-18 20:58:23 · 532 阅读 · 0 评论 -
LeetCode121:Best Time to Buy and Sell Stock I and II
public class Solution { public int maxProfit(int[] prices) { if(prices==null || prices.length==1){ return 0; } int ans = Integer.MAX_VALUE; for(int i=0;原创 2016-12-31 14:09:34 · 356 阅读 · 0 评论 -
LeetCode 46: Permutations
即求n个不重复的数的组合。 思路: 先固定第一位,枚举第二位,。。。第n位,注意需要记录已经用过的数字。用代码说话:public class Solution { public List<List<Integer>> ans = new ArrayList<>(); public boolean[] used = new boolean[100]; //記錄用過的數組 p原创 2016-11-29 20:28:38 · 353 阅读 · 0 评论 -
LeetCode 39:Combination Sum
每一次向下搜索时,起始位置都和上一次相同,因为可以取相同元素不止一次,即每次向下传入的index For循环每次从index开始,避免返回到之前的元素 DFS搜索 如果sum>target 则return 如果sum == target 则记录下来 否则 继续DFS搜索public class Solution { public List<List<Integer>> ans =原创 2016-12-01 20:29:14 · 391 阅读 · 0 评论 -
LeetCode40:Combination Sum II
从集合中取n个数和为target,数字可能有重复,每个数字只能选一次,这道题目需要注意candidates[] 数组中的元素是会有重复的,所以答案里面会出现重复的解,需要在求解过程中对相同的数字不再进行深度搜索即可。 public class Solution { public List<List<Integer>> ans = new ArrayList<>(); public L原创 2016-12-04 18:16:29 · 289 阅读 · 0 评论 -
抽屉原理( 鸽巢原理、重叠原理、狄利克雷)笔记记录
桌上有十个苹果,要把这十个苹果放到九个抽屉里,无论怎样放,我们会发现至少会有一个抽屉里面至少放两个苹果。这一现象就是我们所说的“抽屉原理”。 抽屉原理的一般含义为:“如果每个抽屉代表一个集合,每一个苹果就可以代表一个元素,假如有n+1个元素放到n个集合中去,其中必定有一个集合里至少有两个元素。” 抽屉原理有时也被称为鸽巢原理。它是组合数学中一个重要的原理。第一抽屉原理:原理1: 把多于n个(n+k)原创 2016-09-07 15:49:15 · 11958 阅读 · 0 评论 -
NMF非负矩阵分解以及更新迭代公式
NMF:非负矩阵因式分解。 NMF一直被认为是对多维数据分解的一个很有效的方法,包括在聚类和推荐系统中应用等。NMF矩阵算法介绍:给定一个非负矩阵V,我们可以找到2个非负分解因子矩阵W,H.其中,W称为权重矩阵,H称为特征矩阵。公式如下:当n维数据向量集放置在n*m的矩阵V中,其中m是数据集的大小。V分解的的权重矩阵W:n*r;V分解的特征矩阵H: r*m; 通常r小于n,m。r表转载 2016-01-16 17:26:40 · 14299 阅读 · 6 评论 -
旋转数组的最小数字
题目: 把一个数组最旋转数组的特点:(1)递增排序的数组旋转之后的数组可划分为两个排序的子数组;(2)前面的子数组的元素都大于或等于后面子数组的元素;(3)最小的元素刚好是两个子数组的分界线;(4)旋转数组在一定程度上是有序的;在有序的数组中可以用二分查找实现O(logn)的查找,我们也可用二分查找的思想寻找旋转数组的最小数字。思路: 1. 设置两个指针,初始状态第一个指针指向前面子数组的第一个元原创 2016-09-27 16:24:07 · 303 阅读 · 0 评论 -
调整数组顺序使奇数位于偶数前面
题目: 输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有奇数位于数组的前半部分,所有偶数位于数组的后半部分。最直接的想法是:从头到尾扫描这个数组,如果遇到偶数时,将这个偶数取出,将后面的每个数字往前挪一位,最后将取出的偶数放置在最后的位置上。每次取出一个偶数,后面的数都需要移动,所以时间复杂度O(n2)O(n^2)考虑双指针解法: 一个指向数组的首部(st),另一个指向数组的尾部(e原创 2016-09-29 08:59:43 · 581 阅读 · 0 评论 -
LeetCode106:Construct Binary Tree from Inorder and Postorder Traversal
/** * Definition for a binary tree node. * public class TreeNode { * int val; * TreeNode left; * TreeNode right; * TreeNode(int x) { val = x; } * } */public class Solution {原创 2016-12-11 19:36:32 · 293 阅读 · 0 评论 -
LeetCode 357: Count Numbers with Unique Digits
public class Solution { public int countNumbersWithUniqueDigits(int n) { if(n==0) return 1; if(n==1) return 10; int ans =10; int base = 9; //int result=0;原创 2016-12-11 11:08:32 · 283 阅读 · 0 评论 -
LeetCode111:Minimum Depth of Binary Tree
DFS系列思路: 1.边界条件:如果树为空,则返回 2.满足条件的解:当到达叶子节点时,即左右子树为空,则比较当前的深度与所记录的最小深度,若比最小深度小,则更新最小深度,否则不执行。 3.如果左子树不为空则进行搜索,如果右子树不为空则进行搜索。public class Solution { public int minDepth=Integer.MAX_VALUE; publ原创 2016-12-09 16:29:51 · 290 阅读 · 0 评论 -
LeetCode 22 :Generate Parentheses
作为经典的回溯问题,这道题对于理解回溯的基本框架帮助还是挺大的。所谓Backtracking都是这样的思路:在当前局面下,你有若干种选择。那么尝试每一种选择。如果已经发现某种选择肯定不行(因为违反了某些限定条件),就返回;如果某种选择试到最后发现是正确解,就将其加入解集所以在思考问题的时候,首先需要考虑: 1. 边界条件(任何算法都需要考虑这个,往往输入并不如你所想那么理想) 2. 满足解的条件原创 2016-12-07 21:27:53 · 322 阅读 · 0 评论 -
LeetCode113:Path Sum II
将当前节点加入到临时存储集中,若满足条件则加入到结果集,否则向下搜索左右子树,在搜索完左右子树后还原(回溯法)1、概念 回溯算法实际上一个类似枚举的搜索尝试过程,主要是在搜索尝试过程中寻找问题的解,当发现已不满足求解条件时,就“回溯”返回,尝试别的路径。 回溯法是一种选优搜索法,按选优条件向前搜索,以达到目标。但当探索到某一步时,发现原先选择并不优或达不到目标,就退回一步重新选择,这种走不通就原创 2016-12-06 09:42:13 · 361 阅读 · 0 评论 -
LeetCode376:Wiggle Subsequence
这道题的意思是寻找一个子序列,这个序列需要满足一定的条件: 1. 不能连续递增或者递减 2. 只能间隔递增或者递减 3. 两数之间的差值必须不为0对于满足要求的序列[1,7,4,9,2,5],我们可以做一个图: 我们发现这个图形的规律,是不是一上一下或者一下一上,形成一个拐点就是答案呢?再来看看几种不符合情况的图:第一种情况: 只需要将标记红色的去除,即可得到wiggle su原创 2016-12-21 08:50:28 · 529 阅读 · 0 评论