摘要: 题目: 给出n, k。求从1~n里面取k个的不同组合。(不能有重复的) 乍一看,这不就和全排列很像吗?不就是= k时记录然后return就好了。但是如果按排列做的话,会有很多重复的。如 [1, 4] 和 [4, 1] 在排列中算不一样的,但在组合中是一样的,和元素出现的顺序无关。所以如果按排列做,会 阅读全文
posted @ 2019-04-16 07:55 末夏始秋 阅读(331) 评论(0) 推荐(0) 编辑
摘要: 题目:给定一组数,给出所有可能的全排列(次序无所谓)。 非常标准的回溯解法。为了避免重复添加元素,有两种处理方式: 1. 把添加过的元素交换到数组末尾。(如注释部分所示) 2. 把添加过的元素交换到数组前端。 阅读全文
posted @ 2019-04-16 07:29 末夏始秋 阅读(140) 评论(0) 推荐(0) 编辑
摘要: 题目: 给定一个链表和需要反转的区间上下界,用one-pass完成反转操作。 思路: 1. 定位 2. 反转 3.链接 实现上尽管已经将能做的做到极致了,各种判断null和记录next node。但倒在了最后的return上。 第一次是忘了写return(又犯了老毛病),加了 return head 阅读全文
posted @ 2019-04-12 13:55 末夏始秋 阅读(218) 评论(0) 推荐(0) 编辑
摘要: 题意很简单,就是把某个为0的元素所在的行和列全部归0。 要求是使空间复杂度尽可能小。 有两种写法,一种是空间复杂度O(m + n)的;一种是O(1)的。 O(m + n): 这是我最开始想的方法,即利用一个额外的关联数组(Map, Set实现都可以)记录哪些行和列需要归零。 O(1): 这个方法最强 阅读全文
posted @ 2019-04-12 08:17 末夏始秋 阅读(232) 评论(0) 推荐(0) 编辑
摘要: 思路: 题意很明显了,要使用二分搜索在O(lgn)时间内找到第一次出现和最后一次出现的目标下标,如果没有出现,则返回-1。 一直以来都只会写最基本的二分查找(找到就停那种),要么就是为了省事直接用Arrays.binarySearch(arr, target); 这次自己写了下,感觉也不是很难。 在 阅读全文
posted @ 2019-04-11 14:08 末夏始秋 阅读(114) 评论(0) 推荐(0) 编辑
摘要: 思路: 1. 预处理k。因为如果k比较大,可能会超时。k %= cnt; 2. 找到新的头节点。从原头节点倒着往回退k次就行了,但是这里链表是单向的。变换一下思路,即从原头节点向前n - k次即可。 3.从新头节点开始遍历,到新头节点的前一个节点(即新尾节点)为止,中间遇到原尾节点时要变向指向原头 阅读全文
posted @ 2019-04-10 13:29 末夏始秋 阅读(118) 评论(0) 推荐(0) 编辑
摘要: 猜猜看,输出会是什么? 想了半天,也没想到为什么输出是这样。 我的推理如下(不知道对不对): 1. 数据域部分属于静态绑定,也就是在运行前(编译时)就确定好值的。所以this.a就是指的B中的a。如果B没有,就是B的父类C中的a......以此类推。 2. 方法属于动态绑定,由实际类型决定,如果没有 阅读全文
posted @ 2019-04-09 15:32 末夏始秋 阅读(119) 评论(0) 推荐(0) 编辑
摘要: 非常经典的一道题,就像单词书的第一个永远都是abandon一样。 思路: 由于不是有序的数组,所以不建议用two pointers来做。leetcode 167就可以用two pointers。 这里直接借助map容器即可。即建立一个值和下标之间的映射。 有两个注意的地方: 1. map这里是区别不 阅读全文
posted @ 2019-04-08 13:31 末夏始秋 阅读(94) 评论(0) 推荐(0) 编辑
摘要: 面试的时候不会写,只写完了层次遍历,挂了,Orz。 思路: 1.层次遍历,bfs。 2.遇到新层的第一个节点才会添加新层。 3.每层从右往左遍历,则最右的始终是每层的第一个。 4.结合2,3。当需要添加新层时,将节点值添加进结果集。 用到的数据结构: 1.队列,这里用双向Deque。 2.线性表,存 阅读全文
posted @ 2019-03-31 03:59 末夏始秋 阅读(294) 评论(0) 推荐(0) 编辑
摘要: 需要对象是可比较的。 思考几个问题? Fruit类为什么要有一个无参构造方法? Fruit类为什么要重写toString方法? 降序排列怎么写? 阅读全文
posted @ 2019-03-29 12:16 末夏始秋 阅读(355) 评论(0) 推荐(0) 编辑