leetcode刷题笔记

数组

题目描述:从排序数组中删除重复项 要求:O(1)的空间复杂度

思路:快慢指针

 

题目描述:买卖股票的最佳时机II(不限交易次数)

思路1:暴力法。 -- 想想如何暴力法,暴力写好也不容易。(n的n次方复杂度)

思路2:波峰波谷法。 必须先找到对应的波谷,才能找到对应的波峰。思考怎样实现。

思路3:计算利润法,只要数组后一项大于前一项,利润就加

思路4:是不是BP也可以?

 

题目描述:给定一个数组,将数组中的元素向右移动k个位置。

要求:(O(1)空间复杂度,尽量3种不同的方法)

思路1:遍历k次,每次将数组向右移动1个元素

思路2:反转,a、将数组整个反转 b、将数组前k个元素反转 c、将数组剩余n-k个元素反转,额外增加一个帮助函数。

思路3:增加额外数组,直接将原数组对应位置的元素,放到新数组修改后的位置上。 空间复杂度不满足要求。

 

题目描述:给定一个整数数组,判断是否存在重复元素。

思路1:hashSet,如果contains为true则表示存在重复元素

思路2:排序(Arrays.sort,堆排,在最坏的情况下具有O(logn)的时间复杂度),遍历

思路3:暴力、双循环遍历。(超时)

 

题目描述:只出现一次的数字,要求线性时间复杂度,不分配额外空间

思路1:hashSet或list或hashTable,弹入弹出,最后剩余的即为不重复的元素。不满足空间复杂度

思路2:数学知识,先Set去重,然后2 * (a + b + c) - (a + a + b + b + c) = c

思路3:位运算,和0异或,最后异或完,即为不重复的元素。

 

题目描述:两个数组的交集II

思路1:增加一个hashMap和一个list的额外空间,用hashMap判断是否重复

思路2:先排序,然后双指针

进阶:

如果给定的数组已经排好序,如何优化?

如果nums1比nums2小很多,哪种方法更优?

如果nums2的元素存储在磁盘上,并且不能一次加载到内存中该怎么办?

 

题目描述:加一

思路1:循环,注意判断边界条件,推出条件。不要判断是否为9,直接用整数取余。

 

题目描述:移动零,将数组中所有的零移动到末尾。要求:尽量在原数组上操作,尽量减少移动次数。

思路:双指针,一个指针i用来存放非零元素,一个指针j用来向后遍历寻找非零元素,数组剩余位数置0

 

题目描述:两数之和

思路1:暴力循环 O(n方)

思路2:HashMap O(n)  hashmap中key为数组中的value,value为数组中的索引

 

题目描述:有效的数独

思路:如何枚举子数独:box_index = (row / 3) * 3 + columns / 3,hashMap,判断当前cell中的元素是否在行/列/子数独的hashMap中出现过

 

题目描述:旋转图像 要求:不要使用附加数组

思路1:先转置,然后逐行反转

思路2:??

思路3:??

 

字符串

题目描述:反转字符串char[] 要求:使用O(1)的额外空间

思路1:遍历到中间位置

思路2:双指针,一个指针从头到尾,一个指针从尾到头,直到后面的指针小于前面的指针

 

题目描述:整数反转(考虑负数和末尾为0还有溢出的情况)

思路1:字符串方法 + try...catch...捕获异常,效率较低,不考虑

思路2:数学方法,遍历,每次结果*10,考虑溢出。溢出的临界条件可以通过Integer.MAX_VALUE%10和Integer.MAX_VALUE/10来得出

 

题目描述:字符串中的第一个唯一字符

思路1:双循环遍历

思路2:haspMap(散列表)2次循环,2*O(N)

 

题目描述:有效的字母异位词

思路1:s.toCharArray,转换成数组,排序,查看对应位置是否相等

思路2:hashMap

进阶:如果输入字符串中包含unicode字符怎么办?

 

题目描述:验证回文字符串

思路:双指针

 

题目描述:字符串转整数

思路:先略过,考虑正则的思路。。。

 

题目描述:实现strStr()

思路1:kmp算法。。。 不懂  有时间可以再看看

思路2:循环遍历

 

题目描述:报数

思路:递推

 

题目描述:最长公共前缀

思路:思路众多,值得一看。

思路1:水平扫描法

 

思路2:逐列比较每个字符

思路3:分治

思路4:二分

进阶:字典树

链表

题目描述:删除链表中的节点

思路1:能获取上个节点的情况下,将上个节点的指针指向下下个节点。

思路2:如果不能获取上个节点的情况,将当前节点变为下个节点,并将当前节点指针指向下下个节点

 

题目描述:删除链表的倒数第N个节点

思路1(优):哑节点 + 双指针

思路2:两次遍历

 

题目描述:反转链表

思路1:迭代(nextTmp)需要辅助中间变量

思路2:递归。解法值得一看。n1->n2...nk-1->nk->nk+1<-nk+2-<...nm

思路3:Stack

 

题目描述:合并两个有序链表

思路1:迭代,哑节点和双指针 while(l1 != null && l2 != null)

思路2:递归(未看)

 

题目描述:回文链表

思路:快慢指针和反转链表(反转链表可以用栈代替,但是无法满足O(1)的空间复杂度要求)

 

题目描述:环形链表

思路1:Hash表(HashSet)

思路2:快慢指针

 

题目描述:二叉树的最大深度

思路1:递归

思路2:迭代(未看)

 

题目描述:验证二叉搜索树

 

你可能感兴趣的:(leetcode刷题笔记)