leetcode算法思想快速一览

最近在看八股文。整理了一下思路,想深入了解还得多去写,无奈时间紧迫的情况下抛砖引玉也不失为下策:

1.Two Sum Easy
给出一个数组,找出其中两个和为目标值的坐标。
思路:

[1]排序。
和为目标值,一般的思路是先排序,然后取两点坐标分别从首尾向中间移动。若和为目标值则返回两点坐标。若和大于目标值,右端坐标值-1,反之左端坐标值+1;
[2]因为需要返回坐标值。需要对键值对进行按值排序。以保留原始坐标。

2.Add Two Numbers Medium
有两个反向存储数字的链表,求他们的和。
思路:

[1]这种需要求和,进位频繁的工作选取一个全局变量来存储临时的和。(比如两个数的个位分别是9和8,那么先不必考虑进位,这个全局变量的值就是17,运算完成后,和的个位值为 全局变量%10, 然后执行 全局变量 /= 10,得出全局变量的剩余值。在计算十位的时候要加上这个剩余值。)
[2]这道题主要还顺带考察了链表的用法。
[3]注意while循环自带逻辑判断。这两个链表的长度不一,所以循环结构可以这样写:
while(链表1当前节点不为空且链表2当前节点不为空) ;//两个链表都还有值
while(链表1当前节点不为空); //链表2已空
while(链表2当前节点不为空); //链表1已空
if(全局变量 > 0) //如果全局变量>0 说明有进位操作,还需要加长结果链表

3.Longest Substring Without Repeating Characters Medium
找出一个字符串的最长子串,这个字串满足的条件是不出现重复字符。
思路:

[1]一次循环就搞定,不要多次遍历字符串。
[2]怎样标志一个字符是否出现过。因为字符的数量是有限的,一般256个标志位就能标志基本ANSC码的所有字符。
[3]求最长、最大值的思路,是创建一个值用来保存这个“最大值”,每有可能是最大值的值产生的时候,让这个值和原有的最大值进行比较取二者的最大值作为新的最大值。
[4]解题思路。创建一个int类型的数组 charView[256],其中的每个值都初始化成-1。
创建变量 start(目前而言正在判断的字符串的开始坐标) maxlength(得知的最长字符串的长度)
从给出的字符串的第一个字符到最后一个字符逐个遍历。当前坐标为i start初始化为0
如果charView[str[i]] 的值小于0 说明该字符一次都没出现过,start值不变(即当前所计算的字符串还没出现重复字符,继续计算下去) maxlength = max(i-start, maxlength);然后将charView[str[i]]赋值为i
如果charView[str[i]] 的值大于0 说明该字符出现过。那么我就判断这个值是否在start值的左边(start > i),如果在则说明他对我们当前判断的字符串没有影响,我们不必改变start的值,正常maxlength = max(i-start, maxlength)计算,并将charView[str[i]]赋值为i
如果这个值在start值的右边(start < i),那么说明我们当前计算的字符串出现了重复(就是这个str[i]字符)。我们将start值赋值为i,然后继续去遍历。
最后返回maxlength。

4.Median of Two Sorted Arrays Hard
这题看似简单其实很恶啊,大意就是给出两个已经排序好的数组,找出两个数组所有元素中的中位数。
思路:

[1].设数组1的长度为m 数组2的长度为n总数就是m+n 我们就是要找两个数组中第m+n/2大的元素的值。我们设m+n/2为k
[2].如果a1[k/2-1]大于a2[k/2-1],那么a2[0]到a2[k/2-1]的所有值当中都不可能有中值。原因可以这么推倒。
[3]就算取a2[0]~a2[k/2-1]当中最大的值作为中值a2[k/2-1],那么需要从a1中取出k/2+1个数排在a2[k/2-1]的左边才能凑够k个数,让a2[k/2]成为两数组第k大的元素。然而a1中取出k/2个最小的元素当中已经有比a2[k/2-1]大的元素了,所以并不能凑齐k-1个比a2[k/2]小的数。
[4]上述是理想情况下(k/2-1既小于a1的长度也小于a2的长度)。如果不是,那么就用短的数组的长度代替这个值进行相同的判断。
[5]然后将删除不可能的元素的两个数组重新判断,这回要找的是第 k -(k/2-1)或这 k-短的那个数组长度 大的值。删除元素的数组的长度和首指针都进行更新。

findKth方法写的非常经典。更能看出这道题的解题思路:
1. 保持A是短的那一个数组,B是长的
2. 平分k, 一半在A,一半在B (如果A的长度不足K/2,那就pa就指到最后一个)
3. 如果pa的值 < pb的值,那证明第K个数肯定不会出现在pa之前,递归,把A数组pa之前的砍掉,同理递归砍B数组。
4. 递归到 m == 0 (短的数组用完了) 就返回 B[k - 1], 或者k == 1(找第一个数)就返回min(A第一个数,B第一个数)。

double findKth(int a[], int m , int b[], int n, int k)
{
if(m > n)
return findKth(b,n,a,m,k);

if(m == 0)
return b[k-1];

if(k == 1)
return min(a[0], b[0]);

int pa = min(k/2, m), pb = k-pa;

if(a[pa -1] < b[pb-1])
return findKth(a + pa, m - pa, b, n, k - pa);
else if(a[pa - 1] > b[pb - a])
return findKth(a, m, b + pb, n - pb, k - pb);
else
return a[pa - 1];
return 0;
}

double findMid(int A[], int m, int B[], int n)
{
int total = m + n;
if(total & 0x1)
{
return findKth(A,m,B,n, total/2+1);
}
else
{
return
(findKth(A,m,B,n, total/2) + findKth(A,m,B,n, total/2 + 1)) / 2;
}
}

待更新

Longest Palindromic Substring Medium

ZigZag Conversion Easy

Reverse Integer Easy

String to Integer (atoi) Easy

Palindrome Number Easy

Regular Expression Matching Hard

Container With Most Water Medium

Integer to Roman Medium

Roman to Integer Easy

Longest Common Prefix Easy

3Sum Medium

3Sum Closest Medium

Letter Combinations of a Phone Number Medium

4Sum Medium

Remove Nth Node From End of List Easy

Valid Parentheses Esay

时间: 2024-11-07 20:52:24

leetcode算法思想快速一览的相关文章

机器学习&amp;数据挖掘笔记_16(常见面试之机器学习算法思想简单梳理)

http://www.cnblogs.com/tornadomeet/p/3395593.html 机器学习&数据挖掘笔记_16(常见面试之机器学习算法思想简单梳理) 前言: 找工作时(IT行业),除了常见的软件开发以外,机器学习岗位也可以当作是一个选择,不少计算机方向的研究生都会接触这个,如果你的研究方向是机器学习/数据挖掘之类,且又对其非常感兴趣的话,可以考虑考虑该岗位,毕竟在机器智能没达到人类水平之前,机器学习可以作为一种重要手段,而随着科技的不断发展,相信这方面的人才需求也会越来越大.

LeetCode算法编程(两题)

今天看到酷壳推荐的国外编程LeetCode算法编程网站,上面目前有154道算法题,感觉很有意思,平常工作也比较忙,现在很少有时间来锻炼算法相关的东西,有空的时候静下心来,温习下基础,活跃下自已的思路,也是有必要的.先做了几道,后面会陆续补充其它的题目. 1.题目-PlusOne Given a non-negative number represented as an array of digits, plus one to the number. The digits are stored s

leetcode 算法 之 马拉松算法(Manacher&#39;s algorithm)(未完成)

马拉松算法:马拉松算法是用来计算一个字符串中最长的回文字符串(对称字符串,如aba abba). 首先,我们拿到一个字符串S,然后在S中的每个字符之间加#.例如:S="abcb" T="a#b#c#b" 我们T字符串的每一个T[i]向延伸d个字符 使得 T[i-d,i+d]是一个回文字符串.你会立刻发现,d就是以T[i]为中心的最长回文字符串的长度. 我们建立一个P数组,是的P数组的长度等于T的长度,每一个P[i]的值表示对应的T[i]为中心的最大回文字符串的长度.

(转)深度学习前沿算法思想

深度学习前沿算法思想 本文转自: https://mp.weixin.qq.com/s?__biz=MzA5NDExMTAzNA==&mid=2649981646&idx=2&sn=8fe05eac5a5068efb65ca1602e5fd3a0&chksm=8854b69bbf233f8db5dbaa1ea8396d181c9a35e760ab3c1c4934b504f69fe92683972d78d327&mpshare=1&scene=2&sr

KMeans聚类算法思想与可视化

1.聚类分析 1.0 概念 聚类分析简称聚类(clustering),是一个把数据集划分成子集的过程,每一个子集是一个簇(cluster),使得簇中的样本彼此相似,但与其他簇中的样本不相似. 聚类分析不需要事先知道样本的类别,甚至不用知道类别个数,因此它是一种无监督的学习算法,一般用于数据探索,比如群组发现和离群点检测,还可以作为其他算法的预处理步骤. 下面的动图展示的是一个聚类过程,感受一下: 1.1 基本聚类方法 主要的聚类算法一般可以划分为以下几类: 方法 一般特点 划分方法 1.发现球形

高级图像去雾算法的快速实现(转载)

原文:http://blog.csdn.net/laviewpbt/article/details/11555877 最新的效果见 :http://video.sina.com.cn/v/b/124538950-1254492273.html 可处理视频的示例:视频去雾效果 在图像去雾这个领域,几乎没有人不知道<Single Image Haze Removal Using Dark Channel Prior>这篇文章,该文是2009年CVPR最佳论文.作者何凯明博士,2007年清华大学毕业

Dremel: Interactive Analysis of Web-Scale Datasets 1~6节算法思想部分翻译

摘要: Dremel是一个具有可扩展性和交互性,专用于分析只读嵌套数据的查询系统.它本身对多级操作数和柱状数据布局的融合使它得以在秒级的反应时间内对有万亿数量级行记录的表进行集成语句查询.这个系统在谷歌包含数以千计的CPU和PT级的数据量,并有着上千名使用者.这篇论文中,我们将会介绍Dremel的体系结构以及其实现,并阐述它如何实现基于MapReduce的计算.我们将呈现一种全新的嵌套式数据柱状存储方式并通过一个基于几千节点的样例系统实验分析性能. 1.介绍: 大型数据分析性处理已经在互联网公司

常用的算法思想总结

对于计算机科学而言,算法是一个非常重要的概念.它是程序设计的灵魂,是将实际问题同解决该问题的计算机程序建立起联系的桥梁.接下来,我们来看看一些常用的算法思想. (一)穷举法思想 穷举法,又称为强力法.它是一种最为直接,实现最为简单,同时又最为耗时的一种解决实际问题的算法思想. 基本思想:在可能的解空间中穷举出每一种可能的解,并对每一个可能解进行判断,从中得到问题的答案. 使用穷举法思想解决实际问题,最关键的步骤是划定问题的解空间,并在该解空间中一一枚举每一个可能的解.这里有两点需要注意,一是解空

基本算法思想Java实现的详细代码

基本算法思想Java实现的详细代码 算法是一个程序的灵魂,一个好的算法往往可以化繁为简,高效的求解问题.在程序设计中算法是独立于语言的,无论使用哪一种语言都可以使用这些算法,本文笔者将以Java语言为例介绍一些常用的算法思想. 分类 穷举算法思想 递推算法思想 递归算法思想 分治算法思想 概率算法思想  穷举算法思想 穷举算法的基本思想 从所有可能情况中搜索正确答案 1. 对于一种可能情况,计算其结果. 2. 判断结果是否满足,如不能满足者执行第一步来搜索下一个可能的情况:如满足则表示选找到一个