二维数组的回型遍历 #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
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[
17 Letter Combinations of a Phone Number class Solution {public: vector<string> letterCombinations(string digits) { vector<string> ans; if(digits==""){ return ans; } string combination="";
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());
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
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
98 Validate Binary Search Tree 题意:判断给出的二叉树是不是BST 分析:中序遍历并储存结点的值在一位数组中,如果数组是递增序列则二叉树为BST. 代码:/** * Definition for a binary tree node. * struct TreeNode { * int val; * TreeNode *left; * TreeNode *right; * TreeN
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(
124 Binary Tree Maximum Path Sum 题意:在一棵二叉树中,找出和最大的一条路径,路径的起点和终点可以为树的任意两个节点。 分析:自底向上更新节点的值,使得节点的值表示以该点为根往下扩展能形成的路径P(注意,不一定是根到节点的路径)的最大和Sum,由于是自底向上更新的,所以更新的同时可以动态更新以二叉树每个节点作为中转节点连接以该节点左右子节点为根已形成的路径的总最大和。 代码:/** * Definition for a bin
213 House Robber II 题意:在House Robber的基础上做了一点修改,给出的数不是一位数组而是组成了一个环。 分析:方法同House Robber。考虑组成环之后的数,选中第一个数,最后一个数就不能再选了,综合数组nums[0,n-2]和nums[2,n-1]选较大者则为问题答案。 代码:class Solution {public: int rob(vector<int>& nums) {
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;
221 Maximal Square 题意:给出一个只包含0或1的二维矩阵,求矩阵中出现全为1的正方形的面积。 分析:动态规划。设dp[i][j]表示以matrix[i][j]为右下角的正方形的最大边长,转移方程为 代码:class Solution {public: int maximalSquare(vector<vector<char>>& matrix) { int row=ma
273 Move Zeroes 题意:把一个数组中的0全部移到数组后面,不改变其他数的相对顺序 分析:从头开始遍历,遇到0则把0移到数组最后面,定义两个数分别记录数组前面得到的整数个数a和数组最后的0的个数b,当a+b==n(n为数组长度)时遍历结束。 代码:class Solution {public: void moveZeroes(vector<int>& nums) { int a,b;
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
4 Median of Two Sorted Arrays 题意:找出两个已排好序数组(合并之后形成新数组)的中位数,要求复杂度为O(log(m+n)),m,n分别为两数组长度。分析:首先想到的是先把两个数组合并,最暴力的方法就是合并之后再快排一次,复杂度O代码:
3 Longest Substring Without Repeating Characters 题意:给出一字符串,求不出现重复字母的子串的最大长度,例如:"bbbbb",最长为1;"abcabcab",最长为3。分析:
2 Add Two Numbers 题意:给出两个链表的头结点,将两链表每个节点的数相加,构成新的节点。分析:链表遍历。代码:(写得比较繁琐,但比较好懂)/** * Definition for singly-linked list. * struct ListNode { * int val; * ListNode *next; * ListNode(int x) : val(x),
1 Two Sum 题意:给定一个数组nums和一个数target,在nums中找出和等于target的两个数,并返回两者的下标(下标从1开始)。分析:1)用两个for循环暴力两两匹配,复杂度为O(n^2),超时。 2)利用一个unordered_map或者map储存每个数和数的下标,对于每一个数nums[i]查找一次target-nums[i]是否存在,若找到返回两者在数组中的索引值+
222 Count Complete Tree Nodes 题意:求完全二叉树的节点个数。分析: 暴力枚举O(n)会超时。 首先,我们知道满二叉树的节点个数为2^h-1,其中h为树的高度; 其次,将完全二叉树都划分为左子树、根、右子树,由完全二叉树的定义可知,左右子树至少有一棵是满二叉树,于是总节点个数 countNodes(root) = 1+countNodes(root->left)+countNodes(root
151 Reverse Words in a String 题意:把一个句子中以空格隔开的单词分别反转分析:字符串操作。注意去掉首尾的空字符代码:class Solution {public: void reverseWords(string &s) { vector str; string t=""; while(s[0]==' '){ s.erase(0,1)