算法分析
coding_zhan
主营Java、大数据。
展开
-
最长不含重复字符的子字符串
动态规划使用前面得出的结果来计算。同理,这道题也是一样的。如果str=“a” || str="",那么我们只能返回0或者1,就是str.length()。如果str="…ab…",那么从第二个开始,把b与前面的字符串对比,这个时候有两种情况,第一是前面存在b,第二是前面不存在b。如果不存在b,那很简单,我们需要先求出以a为结尾的最长不含重复的子字符串,然后再加1就好了。如果存在呢?有点麻烦,这个时候其实以a结尾的最长子字符串大小还是可以用的,知识要分情况。1、这个时候需要后面的b与前面的比原创 2020-06-23 00:39:30 · 132 阅读 · 0 评论 -
插入排序
简述插入排序是以第一个为有序,然后从第二个开始遍历,用第二个与与前面的数据对比(从后面向前面对比),如果对比之后发现比他们小,则把这个数据向后挪,最后找到一个比他小的,那么就可以放在这个数的后面。 public int[] insertSort(int[] nunbers){ // 定第一个为排好序的。然后从i=1开始进行排序 for(int i = 1; i < nunbers.length; i++){ int flag = i原创 2020-06-21 00:56:46 · 150 阅读 · 0 评论 -
剑指offer——二维数组的查找
遍历每一行,然后通过二分查找算法查找public class Solution { public boolean Find(int target, int [][] array) { for(int i = 0; i < array.length; i++){ if(solve(array[i], target) == 1){ return true; } } r原创 2020-06-17 14:21:36 · 234 阅读 · 0 评论 -
最长公共子序列求解
问题描述求解两个序列的最长公共子序列,而且这里的子序列不要求是连续的。如string a = “abcdefg”, b = “adfbcdef”,那么最长公共子序列应该是abcdef。求解分析暴力法求解通过取得每个序列的所有子序列,如序列a有n个字符,那么就有2的n次方个子序列,因为对于每个字符来说,都可以选择或者不选择两个选项,所以按照排列(这里可能不太对,离散和概率论都有讲过,高中也...原创 2019-12-10 01:10:28 · 153 阅读 · 0 评论 -
最大连续的和——多种分析方法
问题对一个数组如{1,-1,3,-4, 5,10,-5, 11}分析,计算连续和最大的那一串是从哪里到哪里。比如上面这个就可以看到是5,10,-5,11.思路分析暴力求解暴力求解是对所有字串进行计算,最终求出最大的值。分治法分治法是这样的:对一串数组分成两部分,一般从最中间分解,那么这样的话,连续和最大可能有以下三种情况:1,只出现在左边2,只出现在右边3,包含分割点依照这个...原创 2019-12-09 01:11:45 · 154 阅读 · 0 评论 -
动态规划——0-1背包初探
0-1背包关于0-1背包问题,就不多简述了。有n件物品和一个容量为c的背包。第i件物品的重量是重量为w[i],价值是v[i]。已知对于一件物品必须选择取(用1表示)或者不取(用0表示),且每件物品只能被取一次(这就是“0-1”的含义)。求放置哪些物品进背包,可使这些物品的重量总和不超过背包容量,且价值总和最大。分析对于这个问题,其实也可以用回溯法去求解。对于这个问题的解析其实很多博客都写得...原创 2019-12-09 00:12:55 · 187 阅读 · 0 评论 -
快速排序
分析比如对{9, 2, 5 , 4,3,20, 10}进行快速排序。选择一个基点,一般就选择第一个,即9嘛。然后把比9小的放在9的左边,把比9大的都放在9的右边。然后再从最左边到9(不包含9)这一段重新进行快速排序(重新进行递归),从9(不包含9)到最后一个数这个段进行快速排序(重新进行递归)。源代码:#include <iostream>using namespace st...原创 2019-12-08 19:03:20 · 140 阅读 · 0 评论 -
8594 有重复元素的排列问题
前言对一个可能有重复字符的字符串进行全排列,输出所有不同字符串和最终的排序次数。分析假如只是叫你求全排列,该怎么写?参考回溯法,看一下这篇之前写的博文。下面这块代码是全排列的:#include <iostream>using namespace std;char s[100];int number;void Perm(char str[], int low, ...原创 2019-12-07 20:35:05 · 297 阅读 · 0 评论 -
贪心算法——活动安排问题、背包问题、多机调度问题
前言贪心算法,总是做出在当前看来时最好的选择。活动安排问题给出多个活动的开始时间和结束时间,每个活动都要占用相同的资源,求最大的活动安排。解析给出两个数组:开始时间s和结束时间 j。并对 j 进行递增排列,这个时候s也是要变化的。其实这里也可以用结构体吧,这样在排列的时候更加友好一点,当然这是数据结构的问题了。然后结束时间最早的就可以当作第一个任务,后面从第二个最早结束时间开始,要是第...原创 2019-12-05 17:16:49 · 655 阅读 · 0 评论 -
回溯法搜索排列数
排列数排列数:举个例子,1, 2, 3的排列数就是:3 1 23 2 11 3 21 2 32 1 32 3 1那么如何得到这个排列数呢?看这个回溯法搜索排列数框架:void Backtrack(int t) { if (t > n) { output(); } else { for (int i = t; i <= n; i++) { Swap(...原创 2019-12-03 20:56:42 · 586 阅读 · 0 评论 -
8603 子集和问题
DescriptionS是一个整数集合,S={x1,x2,…,xn},c是一个整数。这里集合元素xi(1<=i<=n)和c都是整数,可能为负。子集和问题就是:判断是否存在S的一个子集S1,使得:解析运用回溯法搜索子集树的框架:void Backtrack(int t){ if(t > n){ output(); } else{ for(int i = 0...原创 2019-12-03 19:35:29 · 368 阅读 · 0 评论 -
基站建设——排序和贪心
一条很长的乡村公路(我们可以想象这条公路是一条长线段,有一个西端点和一个东端点),公路旁稀疏的分布着一些房子。我们把公路的西端点固定在坐标0上,东端点为某远处。假设这些房子的居民都使用蜂窝移动电话,现在需要把移动电话基站放在这条路旁的某些点上,使得每个房子都在其中一个基站4公里之内。注意:房子和基站都建立在公路旁而不远离公路,即可以认为房子和基站都是公路直线上的点。给出一个有效算法,使得...原创 2019-11-12 16:20:58 · 1253 阅读 · 0 评论 -
可以移动的石子合并
题目概述:有n堆石子形成一行(a1,a2,…,an,ai为第i堆石子个数),现要将石子合并成一堆,规定每次可选择至少2堆最多k堆移出然后合并,每次合并的分值为新堆的石子数。若干次合并后,石子最后肯定被合并为一堆,得分为每次合并的分值之和。现在求解将这n堆石子合并成一堆的最低得分和最高得分。分析:(1)保证每次选两堆最多的,合并直至只剩一堆为止,能获得最大得分;这个和huffman树构...原创 2019-11-09 16:28:20 · 295 阅读 · 0 评论 -
区间相交问题:贪心算法
题目概述:给定x轴上n个闭区间,去掉尽可能少的闭区间,使剩下的闭区间都不相交。注意:这里,若区间与另一区间之间仅有端点是相同的,不算做区间相交。例如,[1,2]和[2,3]算是不相交区间。分析:这道题其实网上分析挺多的,解决起来也不是很难。这里提供两种思路:第一种:利用最小区间。但是在其他博文看到好像说不行,如下第三:或许这种思路不是贪心算法?说一下思路吧。对区间数据进行排序,...原创 2019-11-09 12:58:00 · 2802 阅读 · 0 评论 -
最优自然数分解问题
问题描述:设n是一个正整数。(1)现在将n分解为若干个互不相同的自然数之和,且使这些自然数的乘积最大。(2)现在将n分解为若干个自然数之和,且使这些自然数的乘积最大。编程任务:对于给定的正整数n,编程计算问题(1)和(2)的最优分解的最大乘积。注意:这里的自然数不含0但允许为1。特别地,当整数n无法分解为若干互不相同的加数时,即自身视为单独的一个加数,比如输入2,问题(1)的解输出...原创 2019-11-09 00:55:37 · 1313 阅读 · 0 评论 -
最长公共子字符串:动态规划
关于这道题的讲解可以看一下这篇博客,已经很清晰了!直接贴代码吧:#include <iostream>#include<cstring>using namespace std;char string1[10000];char string2[10000];void Findlar() { int length1 = strlen(string1);...原创 2019-10-27 22:03:10 · 129 阅读 · 0 评论 -
数字三角动态规划
#include <iostream>using namespace std;void solve(int row) { //输入: int **a = new int*[row];//这个时输入的 int **b = new int*[row];//这个是记录的 for (int i = 0; i < row; i++) { b[i] = new int[r...原创 2019-10-27 19:51:27 · 125 阅读 · 0 评论 -
最长上升子序列
采用动态规划。#include <iostream>#include <vector>using namespace std;int fineLar(vector<int> array) { vector<int> count(array.size()); for (int i = 0; i < count.size(); i...原创 2019-10-27 13:08:37 · 85 阅读 · 0 评论 -
幸运之星(约瑟夫环)
描述每年新年派对的最后一个节目就是选出下年的“幸运之星”,有丰厚的大礼包的噢~~。 O(∩_∩)O所以每位参加派对的人士都摩拳擦掌跃跃欲试。选择的办法是这样约定的:(1)所有参与的人员数n,让n个人一字排开,然后至左向右从1开始报数,凡报到奇数号的全部后退剔除,剩下的人员,又至左向右报数,逢奇剔除,如此不断的递归下去,直至只有一个人为止,这个人就是“幸运之星”。(2)所有参与的人员数n...转载 2019-10-20 23:16:28 · 382 阅读 · 1 评论 -
两个有序数序列中找第k小
Description已知两个已经排好序(非减序)的序列X和Y,其中X的长度为m,Y长度为n,现在请你用分治算法,找出X和Y的第k小的数,算法时间复杂度为O(max{logm, logn})。此题请勿采用将序列X和Y合并找第k小的O(m+n)的一般方法,要充分利用X和Y已经排好序的这一特性。输入格式第一行有三个数,分别是长度m、长度n和k,中间空格相连(1<=m,n<=100...原创 2019-10-19 18:49:18 · 640 阅读 · 0 评论 -
统计逆序对:分治和递归
Description设a[0…n-1]是一个包含n个数的数组,若在i<j的情况下,有a[i]>a[j],则称(i, j)为a数组的一个逆序对(inversion)。比如 <2,3,8,6,1> 有5个逆序对。请采用类似“合并排序算法”的分治思路以O(nlogn)的效率来实现逆序对的统计。一个n个元素序列的逆序对个数由三部分构成:(1)它的左半部分逆序对的个数,(2...原创 2019-10-14 16:05:44 · 714 阅读 · 0 评论 -
前缀平均值
数列的前缀平均值(prefix average)问题:给定存储n个double型浮点数的数组X,要计算数组A,其中A[i]为元素X[0],…, X[i]的平均值(i=0,…,n-1)(1<=n<=1000000),即前缀平均值在经济学和统计学中广泛应用。例如,给定一个基金的年回报,投资者想要知道前一年、前三年、前五年以及前十年奖金的年度平均回报。前缀平均值还可以用作某一快速...原创 2019-10-11 13:32:53 · 627 阅读 · 0 评论 -
相邻最大矩形面积
在X轴上水平放置着 N 个条形图,这 N 个条形图就组成了一个柱状图,每个条形图都是一个矩形,每个矩形都有相同的宽度,均为1单位长度,但是它们的高度并不相同。例如下图,图1包含的矩形的高分别为2,1,4,5,1,3,3 单位长度,矩形的宽为1单位长度。你的任务就是计算柱状图中以X轴为底边的最大矩形的面积。图2阴影部分就是上述例子的最大矩形面积。输入格式输入数据的第一行是一个整数 N(1...原创 2019-10-11 13:04:48 · 563 阅读 · 0 评论 -
分治法用递归求排列问题
题目如下:分治法求众数:给定含有n个元素的多重集合S,每个元素在S中出现的次数称为该元素的重数。多重集S中重数最大的元素称为众数。例如,S={1,2,2,2,3,5}。多重集S的众数是2,其重数为3。编程任务:对于给定的由n个自然数组成的多重集S,采用分治算法编程计算S的众数及其重数。输入格式第1行多重集S中元素个数n;接下来的一行为集合S,有n个自然数。( n < 100000...原创 2019-10-08 17:30:29 · 703 阅读 · 0 评论