- 博客(47)
- 资源 (1)
- 收藏
- 关注
原创 二维数组的回型遍历
#include#includeusing namespace std;void travel(int **vec,int row, int col,int level,int count){ if (row - 2 * level == 0 || col - 2 * level == 0){ return; } if (row-2*level == 1){ for (int
2016-02-20 12:37:52
1917
原创 Maximum Product of Word Lengths
class Solution {public: int maxProduct(vector& words) { int n=words.size(); vector dict(n,0); for(int i=0;i<n;++i){ for(char c:words[i]){ dict[
2015-12-16 12:15:32
541
原创 17 Letter Combinations of a Phone Number
class Solution {public: vector<string> letterCombinations(string digits) { vector<string> ans; if(digits==""){ return ans; } string combination="";
2015-12-01 16:55:47
479
原创 16 3Sum Closest
class Solution {public: int threeSumClosest(vector<int>& nums, int target) { int n=nums.size(); int closest=nums[0]+nums[1]+nums[2]; sort(nums.begin(),nums.end());
2015-12-01 16:43:41
383
原创 15 3Sum
class Solution {public: vector<vector<int>> threeSum(vector<int>& nums) { vector<vector<int>> ans; int n=nums.size(); if(n<3){ return ans; } sor
2015-12-01 16:33:28
405
原创 312 Burst Balloons
动态规划:dp[i][j]表示气球i到气球j的最佳coins 动态转移方程: dp[i][j]=max(dp[i][k-1]+nums[i-1]*nums[k]*nums[j+1]+dp[k+1][j]) k∈[i,j]class Solution {public: int maxCoins(vector<int>& nums) { for(int i=0;i<num
2015-12-01 15:41:38
2190
原创 98 Validate Binary Search Tree
题意:判断给出的二叉树是不是BST 分析:中序遍历并储存结点的值在一位数组中,如果数组是递增序列则二叉树为BST. 代码:/** * Definition for a binary tree node. * struct TreeNode { * int val; * TreeNode *left; * TreeNode *right; * TreeN
2015-09-25 20:21:48
373
原创 257 Binary Tree Paths
题意:给定二叉树,找出所有根到叶子的路径分析:dfs.代码:/** * Definition for a binary tree node. * struct TreeNode { * int val; * TreeNode *left; * TreeNode *right; * TreeNode(int x) : val(x), left(
2015-09-25 20:13:57
383
原创 124 Binary Tree Maximum Path Sum
题意:在一棵二叉树中,找出和最大的一条路径,路径的起点和终点可以为树的任意两个节点。 分析:自底向上更新节点的值,使得节点的值表示以该点为根往下扩展能形成的路径P(注意,不一定是根到节点的路径)的最大和Sum,由于是自底向上更新的,所以更新的同时可以动态更新以二叉树每个节点作为中转节点连接以该节点左右子节点为根已形成的路径的总最大和。 代码:/** * Definition for a bin
2015-09-23 20:02:07
663
原创 213 House Robber II
题意:在House Robber的基础上做了一点修改,给出的数不是一位数组而是组成了一个环。 分析:方法同House Robber。考虑组成环之后的数,选中第一个数,最后一个数就不能再选了,综合数组nums[0,n-2]和nums[2,n-1]选较大者则为问题答案。 代码:class Solution {public: int rob(vector<int>& nums) {
2015-09-23 17:45:04
496
原创 198 House Robber
题意:给定非负数的一维数组,从中选出不相邻的一组数,使这组数之和最大。分析:动态规划,设dp[i]表示nums[0,i]所选数组的最大和,状态转移方程为dp[i]=dp[i]=max(dp[i-1],dp[i-2]+nums[i]);代码:class Solution {public: int rob(vector& nums) { int ans=0;
2015-09-23 17:25:48
419
原创 221 Maximal Square
题意:给出一个只包含0或1的二维矩阵,求矩阵中出现全为1的正方形的面积。 分析:动态规划。设dp[i][j]表示以matrix[i][j]为右下角的正方形的最大边长,转移方程为 代码:class Solution {public: int maximalSquare(vector<vector<char>>& matrix) { int row=ma
2015-09-23 10:12:38
390
原创 273 Move Zeroes
题意:把一个数组中的0全部移到数组后面,不改变其他数的相对顺序 分析:从头开始遍历,遇到0则把0移到数组最后面,定义两个数分别记录数组前面得到的整数个数a和数组最后的0的个数b,当a+b==n(n为数组长度)时遍历结束。 代码:class Solution {public: void moveZeroes(vector<int>& nums) { int a,b;
2015-09-22 13:39:05
422
原创 72 Edit Distance
题意:给出两个字符串word1、word2,现有三种操作insert delete replace每次操作只能修改一个字符,求通过这三种操作把word1转变成word2的最少次数。分析:动态规划。定义dp[i][j]表示word1的子串word1[0,i-1]转变成word2[0,j-1]的最小次数,动态转移方程为: dp[i][j
2015-09-22 10:57:57
376
原创 4 Median of Two Sorted Arrays
题意:找出两个已排好序数组(合并之后形成新数组)的中位数,要求复杂度为O(log(m+n)),m,n分别为两数组长度。分析:首先想到的是先把两个数组合并,最暴力的方法就是合并之后再快排一次,复杂度O代码:
2015-09-21 22:30:39
350
原创 3 Longest Substring Without Repeating Characters
题意:给出一字符串,求不出现重复字母的子串的最大长度,例如:"bbbbb",最长为1;"abcabcab",最长为3。分析:
2015-09-20 19:29:05
376
原创 2 Add Two Numbers
题意:给出两个链表的头结点,将两链表每个节点的数相加,构成新的节点。分析:链表遍历。代码:(写得比较繁琐,但比较好懂)/** * Definition for singly-linked list. * struct ListNode { * int val; * ListNode *next; * ListNode(int x) : val(x),
2015-09-18 16:22:20
284
原创 1 Two Sum
题意:给定一个数组nums和一个数target,在nums中找出和等于target的两个数,并返回两者的下标(下标从1开始)。分析:1)用两个for循环暴力两两匹配,复杂度为O(n^2),超时。 2)利用一个unordered_map或者map储存每个数和数的下标,对于每一个数nums[i]查找一次target-nums[i]是否存在,若找到返回两者在数组中的索引值+
2015-09-18 16:11:38
367
原创 222 Count Complete Tree Nodes
题意:求完全二叉树的节点个数。分析: 暴力枚举O(n)会超时。 首先,我们知道满二叉树的节点个数为2^h-1,其中h为树的高度; 其次,将完全二叉树都划分为左子树、根、右子树,由完全二叉树的定义可知,左右子树至少有一棵是满二叉树,于是总节点个数 countNodes(root) = 1+countNodes(root->left)+countNodes(root
2015-09-18 09:57:40
718
原创 151 Reverse Words in a String
题意:把一个句子中以空格隔开的单词分别反转分析:字符串操作。注意去掉首尾的空字符代码:class Solution {public: void reverseWords(string &s) { vector str; string t=""; while(s[0]==' '){ s.erase(0,1)
2015-09-17 23:42:13
577
原创 257 Binary Tree Paths
题意:给定一棵树,求出所有根到叶子节点的路径。分析:DFS。(注意int到string的转换)代码:/** * Definition for a binary tree node. * struct TreeNode { * int val; * TreeNode *left; * TreeNode *right; * TreeNode(in
2015-09-16 09:46:46
338
原创 62 Unique Paths
题意:求在一个mxn的矩阵中,从左上方到达右上方的路径总数。分析:动态规划。dp[i][j]=dp[i-1][j]+dp[i][j-1];代码:class Solution {public: int uniquePaths(int m, int n) { int** dp=new int*[m]; for(int i=0;i<m;++i)
2015-09-15 09:16:53
528
原创 64 Minimum Path Sum
题意:给出一个mxn的非负二维数组,求从左上方到右下方所有路径中最小的和。分析:动态规划。dp[i][j]+=max(dp[i][+1j],dp[i+1][j])代码:int minPathSum(int **grid, int nRows, int nCols) { for(int i=nRows-2;i>=0;--i){ grid[i][nCols-1]+=
2015-09-15 09:13:02
731
原创 209 Minimum Size Subarray Sum
题意:求出总和大于s的最短子序列的长度。分析:两个指针start和end,end往后移并计算start到end之间的数之和sum,不断更新end-start最小值。代码:class Solution {public: int minSubArrayLen(int s, vector& nums) { int n=nums.size(); if(
2015-09-15 00:34:46
463
原创 56 Merge Intervals
题意:合并一系列有重合的区间。例如:Given [1,3],[2,6],[8,10],[15,18], return[1,6],[8,10],[15,18].分析:按start升序排列,再根据end合并。复杂度为O(nlogn).代码:/** * Definition for an interval. * struct Interval { * int star
2015-09-14 10:47:22
460
原创 9 Palindrome Number
题意:判断一个数是否是回文。分析:按照回文的定义进行判断,分别比较第一个和倒数一个数、第二个和倒数第二个数、以此类推。代码:class Solution {public: bool isPalindrome(int x) { if(x<0) return false; int count=1; while(x/count>=1
2015-09-14 09:46:34
291
原创 201 Bitwise AND of Numbers Range
题意:给定两个数m,n,求区间[M,N]上所有数的AND的结果。分析:由于区间[m,n]是连续的,由二进制数的特点,求该区间上所有数的AND结果相当于求m和n的都为1的共同前缀。代码:class Solution {public: int rangeBitwiseAnd(int m, int n) { int count=0; while(m!
2015-09-13 16:27:01
367
原创 100 Same Tree
题意:判断两棵二叉树是否相同。分析:递归。代码:/** * Definition for a binary tree node. * struct TreeNode { * int val; * TreeNode *left; * TreeNode *right; * TreeNode(int x) : val(x), left(NULL),
2015-09-13 10:32:37
310
原创 43 Multiply Strings
题意:给定两个整数num1、num2,计算两者乘积。分析:大数相乘。此题较为简单,不包含正负号、小数点等复杂的情况。代码:(1)普通大数乘法:
2015-09-11 10:47:13
383
原创 131 Palindrome Partitioning
题意:将字符串划分为回文子串序列,求所有的划分方式。分析:考虑将一个字符串划分为子串序列,共有2^(n-1)种不同划分(n为字符串长度),深搜,记录路径并判断每个子串是否为回文,复杂度为O(2^N)。代码:class Solution {public: vector> partition(string s) { vector> ans; vec
2015-09-10 20:15:30
328
原创 279 Perfect Squares
题意:定义perfect squares number 为(1,4,9,16,...) 给出一个正整数n,返回和为n的最小的perfect squares number 的数目。例如:n=12 ,返回3, 因为 12=4+4+4 ; n=13,返回2,因为13=4+9 。分析:动态规划,squares[i]表示i的最小perfect squares number,
2015-09-10 10:11:15
1807
原创 278 First Bad Version
First Bad VersionYou are a product manager and currently leading a team to develop a new product. Unfortunately, the latest version of your product fails the quality check. Since each version is dev
2015-09-09 12:18:53
619
原创 N个正数选取若干个数之和最接近M
问题描述:给定N个正数(A1,、A2、A3、...、AN),从中选取若干(k)个数,使得这些数之和最接近M。算法分析:最接近可能有两种情况,一种是k个数之和小于M,另一种是k个数之和大于M,所以问题可看成两个01背包问题(背包容量分别为M和A1+A2+A3+...+AN-M),较大的为结果。
2015-07-07 09:49:44
4226
转载 Pareto
Pareto Optimality:帕累托最优是指资源分配的一种理想状态,即假定固有的一群人和可分配的资源,从一种分配状态到另一种状态的变化中,在没有使任何人境况变坏的前提下,也不可能再使某些人的处境变好。换句话说,就是不可能再改善某些人的境况,而不使任何其他人受损。Pareto解:多目标规划中,由于存在目标之间的冲突和无法比较的现象,一个解在某个目标上是最好的,在其他的目标上可能比较差。Pa
2015-05-28 21:26:29
5604
原创 random_shuffle函数
上次写遗传算法用到STL里的random_shuffle函数,算法的主要思想在《计算机程序设计艺术》的3.4.2节有详细的分析,现在这里简单说明一下算法的实现。应包含头文件: #include函数原型:SGI版本一template inline void random_shuffle(RandomAccessIterator first, RandomAcces
2015-01-04 17:03:18
4618
原创 遗传算法解决TSP问题(C++)
#include#include#include#include#include#include#include#include #include#includeusing namespace std;class GA{private: struct City{ //城市(名、坐标)结构 string name; //名称
2014-12-10 19:43:28
4323
2
原创 Java编写简单客户/服务器程序
1.建立EchoServer服务器,监听来自客户的连接EchoServer.java:package chapter01;import java.io.*;import java.net.*;public class EchoServer { private int port = 8000; //服务器端口号(IP默认为本地主机IP) priv
2014-12-02 16:11:05
647
原创 关于P、NP、NPC和NP-Hard问题
1、P问题 P中包含的是能在多项式时间内解决的问题,此类问题的时间复杂度不超过O(),期中n为问题输入规模,k为常数。2、NP问题 NP中包含的是能在多项式时间内验证某个解是否正确的问题。 比如:(1)所有的P问题都是NP问题,因为我们总能在多项式时间内验证给定的某个解是否正确。 (2)对于某些不属于P问题的问题,如3-CNF可满足
2014-12-01 21:30:02
872
原创 一个一直忽略的问题
先看看下面两端代码:1. int m=-1; while(m) { m++; } cout2. int m=-1; while(m++) { } cout输出结果分别为:01
2013-07-02 19:51:25
560
原创 TCP建立连接与释放连接
最近复习准备《计算机网络》考试,感觉TCP协议建立连接与释放连接这两个过程比较重要,所以把自己理解的部分写下来。1.建立连接:(三次握手)(1)客户端发送一个SYN包给服务器,然后等待应答。(2)服务器端回应给客户端一个ACK=1、SYN=1的TCP数据段。(3)客户必须再次回应服务器端一个ACK确认数据段。2.释放连接:(四次挥手)(1) TCP客户端发送
2013-06-24 02:00:51
751
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人