zoukankan      html  css  js  c++  java
  • 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:迭代(未看)

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

  • 相关阅读:
    Freemarker进行非空处理
    Freemarker导出带多个不重复图片的word
    Freemarker导出带图片的word
    怎样在Android本地视频播放器开发
    详细解说九宫图比较常用的多控件布局
    POJ 3189 Steady Cow Assignment【网络流】
    C++获取文件大小常用技巧
    operation is executing and cannot be enqueued
    Android 异步链式调用设计
    LINUX编程学习笔记(十三) 遍历目录的两种方法
  • 原文地址:https://www.cnblogs.com/harry1989/p/12112917.html
Copyright © 2011-2022 走看看