题目:21. Merge Two Sorted Lists 合并两个有序链表
var mergeTwoLists = function(l1, l2) {
var ans = new ListNode(-1), cur = ans;
while(l1 && l2){
if(l1.val <= l2.val){
cur.next = l1; l1 = l1.next;
}else{
cur.next = l2; l2 = l2.next;
}
cur = cur.next;
}
cur.next = l1?l1:l2;
return ans.next;
};
题目:53. Maximum Subarray 最大子序和
方法一:动态规划
var maxSubArray = function(nums) {
var ans = nums[0], _dp = [nums[0]], temp;
for(var i = 1; i < nums.length; i++){
temp = nums[i] + _dp[i-1];
_dp.push(Math.max(temp,nums[i]));
ans = Math.max(ans,_dp[i]);
}
return ans;
};
var maxSubArray = function(nums) {
var ans = nums[0];
for(var i = 1; i < nums.length;i++){
nums[i-1]>0 && (nums[i]+=nums[i-1]);
ans = Math.max(ans,nums[i]);
}
return ans;
};
题目:45. Jump Game II
方法一:贪心,反向查找出发位置
var jump = function(nums) {
var cur = nums.length-1;
var res = 0 ,t;
while(cur!=0){
for(var i=0,t=0;i<cur;i++){
if(i+nums[i] >= cur){t=i;break;}
}
cur = t; res++;
}
return res;
};
var jump = function(nums) {
if(nums.length==1) return 0;
var cur = 0, res = 0, t;
while(cur+nums[cur]<nums.length-1){
for(var i=1,t=1;i<=nums[cur];i++){
if(i+nums[cur+i] > t + nums[cur+t]){
t=i;
}
}
cur += t;res++;
}
return res+1;
};
题目:98. Validate Binary Search Tree 验证二叉搜索树
用中序遍历
var isValidBST = function(root) {
var pre = -Infinity;
var func = function(root){
if(root==null) return true;
if(!func(root.left)) return false;
if(root.val <= pre) return false;
pre = root.val;
if(!func(root.right)) return false;
return true;
}
return func(root);
};
题目:983. Minimum Cost For Tickets 最低票价
动态规划
var mincostTickets = function(days, costs) {
var dp = [0],len = days.length-1;
for(var i = 1; i <= days[len]; i++){
if(!days.includes(i)){
dp[i] = dp[i-1];
}else{
dp[i] = Math.min(
dp[Math.max(0,i-1)]+costs[0],
dp[Math.max(0,i-7)]+costs[1],
dp[Math.max(0,i-30)]+costs[2]);
}
}
return dp[dp.length-1];
};
题目:572. Subtree of Another Tree 另一个树的子树
转成json字符串再判断是不是子字符串…
var isSubtree = function(s, t) {
return (JSON.stringify(s).indexOf(JSON.stringify(t)))>-1;
};
常规做法:先序遍历,判断子串(这里判断的方式使用indexOf感觉不太正经… 懒得写KMP)
var isSubtree = function(s, t) {
var sOrder = [], tOrder= [];
var getPreorder = function(t,order){
order.push("v"+t.val);
if(t.left){ getPreorder(t.left,order);
}else{ order.push('l'); }
if(t.right){ getPreorder(t.right,order);
}else{ order.push('r'); }
}
getPreorder(s,sOrder);
getPreorder(t,tOrder);
sOrder = sOrder.join();
tOrder = tOrder.join();
return sOrder.indexOf(tOrder)>-1;
};
题目:221. Maximal Square 最大正方形
var maximalSquare = function(matrix) {
var res = 0;
for(var i=0;i<matrix.length;i++){
for(var j=0;j<matrix[0].length;j++){
if(i>0 && j>0 && matrix[i][j]==1){
matrix[i][j] = Math.min(
matrix[i-1][j-1],matrix[i-1][j],
matrix[i][j-1]) +1;
}
res = Math.max(res,matrix[i][j]);
}
}
return res * res;
};
题目: 69. Sqrt(x)
二分查找
var mySqrt = function(x) {
var l = 0, r = x,m,ans=-1;
while(l<=r){
m = parseInt((l+r)/2);
if(m*m <= x){
ans = m; l = m+1;
}else{
r = m-1;
}
}
return ans;
};
题目:69. Sqrt(x)
二分
var mySqrt = function(x) {
var l = 0, r = x,m,ans=-1;
while(l<=r){
m = parseInt((l+r)/2);
if(m*m <= x){
ans = m; l = m+1;
}else{
r = m-1;
}
}
return ans;
};
var myPow = function(x, n) {
var func = function(x,n){
if(n==0) return 1.0;
var y = func(x,parseInt(n/2));
return n%2?y*y*x:y*y;
}
var res = func(x,n);
return n<0?1/res:res;
};
题目:155. Min Stack 最小栈
用一个额外的栈来记录
var MinStack = function() {
this.st = [];
this.minst =[];
};
MinStack.prototype.push = function(x) {
this.st.push(x);
if(this.minst.length!=0)
this.minst.push(Math.min(x,this.minst[this.minst.length-1]));
else this.minst.push(x);
};
MinStack.prototype.pop = function() {
this.st.pop();
return this.minst.pop();
};
MinStack.prototype.top = function() {
return this.st[this.st.length-1];
};
MinStack.prototype.getMin = function() {
return this.minst[this.minst.length-1];
};
题目:102. Binary Tree Level Order Traversal 二叉树的层序遍历
广度优先搜索
var levelOrder = function(root) {
if(root == null) return [];
var res = [],st = [root,null];
while(st.length>1){
var t = [];
while(true){
var node = st.shift();
if(node == null) break;
t.push(node.val);
node.left && (st.push(node.left));
node.right && (st.push(node.right));
}
res.push(t);
st.push(null);
}
return res;
};
题目:136. Single Number
找唯一没有重复出现的数,用异或
var singleNumber = function(nums) {
var res = 0;
for(var i = 0; i < nums.length; i++){
res ^= nums[i];
}
return res;
};
题目:210. Course Schedule II 课程表 II
拓扑排序:找入度为0的点
var findOrder = function(numCourses, prerequisites) {
var tp = new Array(numCourses).fill(0), res = [];
for(let i = 0; i < prerequisites.length; i++){
tp[prerequisites[i][0]] ++;
}
while(true){
let t = -1;
for(let i = 0; i < numCourses; i++){
if(tp[i] == 0){ t = i; break;}
}
if(t != -1){
res.push(t); tp[t] = -1;
}else{
break;
}
for(let i = 0; i < prerequisites.length; i++){
if(prerequisites[i][1] == t){ tp[prerequisites[i][0]]--; }
}
}
return res.length == numCourses ? res:[];
};
题目:152. Maximum Product Subarray 乘积最大子数组
动态规划
var maxProduct = function(nums) {
var dp = [nums[0]], ln = nums[0]<0?0:-1, res = nums[0];
for(var i=1;i<nums.length;i++){
dp[i] = nums[i];
if(nums[i]>0 && dp[i-1]>0){
dp[i] *= dp[i-1];
}else if(nums[i] <0){
if(ln>=0){
for(var j=ln;j<i;j++){
dp[i] *= nums[j];
}
if(ln>0 && dp[ln-1]>1) dp[i] *= dp[ln-1];
}
ln = i;
}
res = Math.max(res,dp[i]);
}
return res;
};
题目:680. Valid Palindrome II 验证回文字符串 Ⅱ
在允许最多删除一个字符的情况下,同样可以使用双指针,通过贪心算法实现。初始化两个指针 low 和 high 分别指向字符串的第一个字符和最后一个字符。每次判断两个指针指向的字符是否相同,如果相同,则更新指针,令 low = low + 1 和 high = high - 1,然后判断更新后的指针范围内的子串是否是回文字符串
var validPalindrome = function(s) {
var func = function(t){
var l=0,r = s.length-1, flag = true;
while(l<r){
if(s[l]==s[r]){
l++; r--;
}else{
if(flag){
flag = false; t?l++:r--;
}else{
return false;
}
}
}
return true;
}
return func(true) ||func(false);
};
题目:5. Longest Palindromic Substring 最长回文子串 链接
中心扩张,一共有两种情况
bab,中心点是a;
bb,中心点是两个b之间
两种组合取最大回文串的长度(两个指针,往左右移动,找出嘴长回文的长度)
var longestPalindrome = function(s) {
var ans = 1,start=0;
if(s==null || s.length < 2) return s;
var getLongestPalindrome = function(l,r){
let i=0,temp;
while(l-i>=0 && r+i<s.length && s[l-i]==s[r+i]){
temp=(r-l+1)+2*i;
if(ans<temp){ans=temp;start = l-i;};
i++;
}
}
for(let ii = 0;ii<s.length;ii++){
getLongestPalindrome(ii,ii);
getLongestPalindrome(ii,ii+1);
}
return s.substring(start,ans+start);
};