随笔分类 - 算法-数组
摘要:题目:给定一个无序的数组,返回其中最长递增子序列的长度。解法:利用一个辅助数组1,记录每个长度的LIS的结尾字符,最后其长度就是所求值;辅助数组2,与1同步变化,记录数组1中每个元素在输入序列中的原始下标;辅助数组3,与输入数组等长,记录每个元素在一个LIS中的前驱下标。代码: 1 int binS...
阅读全文
摘要:参考July博客:最大连续子序列乘积先考虑不连续的思路:一维动态规划 考虑到乘积子序列中有正有负也还可能有0,可以把问题简化成这样:数组中找一个子序列,使得它的乘积最大;同时找一个子序列,使得它的乘积最小(负数的情况)。虽然只要一个最大积,但由于负数的存在,也要记录最小乘积。碰到一个新的负数元素时...
阅读全文
摘要:剑指offer中有这道题,何海涛博客:数组中出现次数超过一半的数字题目:给定一个数组,数组中有一个数字出现的次数超过数组长度的一半,找出这个数字。思路:先排序,再遍历,统计次数,时间O(N * lgN)。哈希表:统计每个元素次数,当数据分散时消耗空间大。快排的Partition,判断pviot是不是...
阅读全文
摘要:题目:给定一个数组A,对于下标i 2 #include 3 using namespace std; 4 5 int maxDist(int num[], int n) 6 { 7 if(n left_min_pos(n, 0);11 int cur_min_pos = 0;...
阅读全文
摘要:题目:给定一个数组,找出其中和为0的所有4个数组合,每个组合内的4个数非递降。解法:①先排序,然后利用4个指针,前两个遍历,后两个在第二个指针之后的部分里夹逼,时间O(N3)。②或者利用一个哈希表先保存每两个数的和,然后类似于查找两个数的和等于给定值的过程。代码:① 1 class Solution...
阅读全文
摘要:题目:给定一个数组,和一个指定的值,找出数组中3个数,它的和最接近这个指定值,并返回这个和。解法:和上一题找3个数的和为0一样,先排序再遍历,这一次不需要记录路径。代码: 1 class Solution { 2 public: 3 int threeSumClosest(vector &n...
阅读全文
摘要:题目:给定一个数组,找出其中和为0的所有3个数的组合。每个组合的3个数都是非递降的。解法:先排序再遍历,设置3个指针,第一个依次遍历,第二三个在第一个指针后面的部分里,左右夹逼查找和为第一个数的相反数的组合。时间O(N2)。代码: 1 class Solution { 2 public: 3 ...
阅读全文
摘要:题目:x轴上有一些点,每个点上有一条与x轴垂直的线(线的下端就是这个点,不超出x轴),给出每条线的高度,求这些线与x轴组成的最大面积。解法:贪心策略,维持两个指针,分别指向第一个和最后一个元素,对于其中小的一个,它所能围成的最大面积就是到另一个元素之间,所以小的一个要往中间走一步。代码: 1 cla...
阅读全文
摘要:题目:找两个排序数组A[m]和B[n]的中位数,时间复杂度为O(log(m+n))。解法:更泛化的,可以找第k个数,然后返回k=(m+n)/2时的值。代码: 1 class Solution 2 { 3 public: 4 double findMedianSortedArrays(int ...
阅读全文
摘要:题目地址:https://oj.leetcode.com/problems/two-sum/Two SumGiven an array of integers, find two numbers such that they add up to a specific target number.Th...
阅读全文