面试算法题目解答
文章平均质量分 73
贱走偏锋
朝着梦想努力吧
展开
-
leetcode Substring with Concatenation of All Words
Substring with Concatenation of All Words You are given a string, S, and a list of words, L, that are all of the same length. Find all starting indices of substring(s) in S that is a conca原创 2013-11-24 21:01:37 · 1084 阅读 · 0 评论 -
376. Wiggle Subsequence
线性解法:定义up[i]表示从0到i组成最长的wiggle序列,并且序列的最后两个元素a,b的差是正的,即a<b;同理down[i]表示从0到i组成的最长wiggle序列,并且序列最后的两个元素a和b的差是负的,即a>b;状态转移方程:up[i] = down[i-1]+1 (nums[i]>nums[i-1]) up[i-1] (...原创 2019-05-19 23:27:08 · 194 阅读 · 0 评论 -
Best Time to Buy and Sell Stock系列问题
Best Time to Buy and Sell Stock只允许买一次,我们知道卖肯定在买之前,所以只要在考虑要不要卖之前,知道了前面天数的股票最低价就可以得到这一天卖的最大获利:时间复杂度O(n) 空间复杂度O(1)class Solution {public: int maxProfit(vector<int>& prices) { i...原创 2019-04-05 23:29:17 · 218 阅读 · 0 评论 -
红黑树的c++ 实现
红黑树,这个算法导论上有算法流程的介绍,这里简单实现了一下。不同于avl树,红黑树黑色叶子节点还是很有用,在处理删除操作时,多了null的叶子节点,算法写起来顺很多,因为有可能删除了节点之后,调整是从黑色的叶子节点开始的。#ifndef __RBTREE_H__#define __RBTREE_H__#include <vector>#define RBTREE_NOD...原创 2019-04-05 14:51:17 · 144 阅读 · 0 评论 -
AVL树的c++实现
作为最古老的平衡排序二叉树,avl树算是比较经典了,闲着无聊,也自己实现一下,实现了插入和删除操作。avl树的特点: 1. 排序二叉树; 2. 左右子树高度差小于等于1;具体算法流程伪代码随便找一下都会有的,插入也没啥难度,就是判断树高是否发生变化,需要时进行旋转;删除操作节点,然后转移到删除至多只有一个儿子的节点上,根据树高特点进行旋转;删除和插入不同的一点,...原创 2019-04-05 14:16:05 · 198 阅读 · 0 评论 -
Exam Room leetcode
In an exam room, there are N seats in a single row, numbered 0, 1, 2, ..., N-1.When a student enters the room, they must sit in the seat that maximizes the distance to the closest person. If there ar...原创 2018-06-18 17:19:43 · 592 阅读 · 0 评论 -
算法题:给你一个自然数N,求[6,N]之内的所有素数中,两两之和为偶数的那些偶数。
算法题:给你一个自然数N,求[6,N]之内的所有素数中,两两之和为偶数的那些偶数。对于给定的N,我们可以用筛法求素素数的方法在O(n)的时间复杂度内求出所有的素数。然后如何求给定的[6,N]内的数字内的偶数是由两个素数[6,N]组成的呢。记得数学上有这样一个猜想:哥德巴赫猜想任一大于2的偶数,都可表示成两个素数之和所以6到N内的所有偶数都是由两个奇素数相加得到的(素数只有一原创 2013-10-14 14:19:12 · 4382 阅读 · 8 评论 -
Linked List Cycle II
Given a linked list, return the node where the cycle begins. If there is no cycle, return nullFollow up:Can you solve it without using extra space?给定一个链表的头指针,问你能不能只用常数的空间快速判断一个链表是不是有环,如果有环原创 2013-11-11 20:23:37 · 9074 阅读 · 10 评论 -
leetcode Russian Doll Envelopes
题目要求用大信封装小信封,问最多可以这样嵌套多少个。最简单的做法就是动态规划,01背包问题,把数组排序,先按第一个元素排序,再按第二个元素排序。dp[i]表示以i作为最大信封,0-i个信封,最多装多少个。问题没有后续性,时间复杂度O(n^2)然而如果我们对第二个元素排序时按从大到小排序,这时候有个神奇的东西诞生了。问题等价于求LIS(最长上升子序列的长度),倒序第二个元素是为了排除第一原创 2016-07-18 20:36:52 · 526 阅读 · 0 评论 -
常见几种二分查找
二分查找经典的算法很简单,基本注意下循环终止条件和计算中间值mid坐标时注意一下溢出问题,就可以了。下面给出根据二分查找变形求一些特殊值的算法。有问题烦请值证。// 经典二分查找int binary_search( int a[], int n, int value ){if( n == 0 )return -1;int low = 0, high = n - 1;whil原创 2016-07-12 15:21:14 · 458 阅读 · 0 评论 -
leetcode Scramble String
递归调用子问题。每次分成子问题处理,注意子问题不能为空。class Solution {public: bool isScramble(string s1, string s2) { const int n1 = s1.size(); const int n2 = s2.size(); if(n1!=n2)return fal原创 2013-12-19 10:47:41 · 780 阅读 · 0 评论 -
leetcode Validate Binary Search Tree
中序遍历得到所有的顺序之后只需要比较相邻的两个结点是否有序就可以了!/** * Definition for binary tree * struct TreeNode { * int val; * TreeNode *left; * TreeNode *right; * TreeNode(int x) : val(x), left(NU原创 2013-12-18 20:44:30 · 576 阅读 · 0 评论 -
leetcode Longest Valid Parentheses O(n)解法
模拟栈的工作进栈和出站的过程,一对括号如果能匹配,意味着左括号的下标到右括号的下标的这段括号都能匹配,所以只需要模拟一遍就够了!!!用个数组记录那些可以匹配的区间,然后线性扫一遍就可以得到最长的区间了。每个元素最多进栈一次,出栈一次,线性扫描只需要一遍,所以时间复杂度为O(n),空间复杂度也是O(n)class Solution {public: int longestVal原创 2013-12-16 14:21:43 · 829 阅读 · 0 评论 -
leetcode Trapping Rain Water
做法就是维护一个非严格递减,遇到不递减的高度,就不断地往栈中弹出元素直到栈顶元素的高度比这个大为止或者栈为空,如果栈为空,那么证明这一段的容量就可以计算出来了,如果栈不为空,那么从栈顶位置到当前位置的容量可以用这个两个高度的较低者水的水平线。我们可以把道题看成有几个容器,我们来确定容器的两个侧边。如果左侧边比右侧边小,那么这一段容量就可以求了,因为如果后面遇到更比右侧边更大的边不会影响这个的结原创 2013-12-12 15:14:18 · 764 阅读 · 0 评论 -
leetcode Maximal Rectangle
题目要求:给定一个矩阵,元素只有0和1,求一个面积最大的矩形! ///思路一:看成是每一行向上可以延伸到多远,然后求以这个为底边的一个最大矩形,就是一个单调栈问题了! /////思路二:预处理height[i][j]数组表示向上i,j可以到达多远,left[i][j]表示height[i][j]这条线段向左可以 ////到达多远,right表示原创 2013-12-11 18:19:34 · 759 阅读 · 0 评论 -
leetcode word break
正常的搜索,加个数组dp[i]判断从i这个位置到结尾能否刚好划成几个词,class Solution {public: vector wordBreak(string s, unordered_set &dict) { // Note: The Solution object is instantiated only once and is reused by原创 2013-12-12 09:48:27 · 707 阅读 · 0 评论 -
Leetcode Search for a Range
class Solution {public: vector searchRange(int A[], int n, int target) { int low = binarylow(A,n,target); vector ans; ans.push_back(low); low = binary(A,n,ta原创 2013-12-08 15:31:41 · 710 阅读 · 0 评论 -
leetcode Word Ladder II
先用bfs得出最短路径长度,在bfs过程中,可以得到每一层有多少个结点可以到达,也就是在最短走k步的情况下,到达的结点,这样待会在求所有路径的时候就可以剪枝。。。vector edge[1000000];set censhu[10000];class Solution {public: vector > findLadders(string start, string原创 2013-11-25 10:16:46 · 734 阅读 · 0 评论 -
1044. Longest Duplicate Substring
题目大意:给定一个字符串,长度为n(n<=100000),求所有的子串中,子串出现次数大于等于2的最长子串。n=10^5级别,暴力解法肯定过不了。解法一: 二分答案+Rabin-Carp两个问题需要解决:1. 如何快速计算子串长度;2. 如何快速比较相同子串是否相等第一个问题,可以采用二分的思想,如果不存在长度为k的冗余子串,也不可能存在长度大于k的冗余子串,如果存在长度...原创 2019-05-15 10:38:35 · 1105 阅读 · 0 评论