本书的主要读者是计算机科学家、计算机工程师,以及那些想通过学习计算机系统的内在运作而能够写出更好程序的人。
我们的目标是解释所有计算机系统的本质概念,并向你展示这些概念是如何实实在在地影响应用程序的正确性、性能和实用性的。其它的系统类书籍都是从构建者的角度来写的,讲述如何实现硬件或是系统软件,包括操作系统、编译器和网络接口。而本书是从程序员的角度来写的,讲述应用程序员如何能够利用系统知识来编写出更好的程序。
《深入理解计算机系统》学习笔记 - 前言节选
发表于 2016-11-10
| 分类于
CSAPP
Leetcode 题解 - 225. Implement Stack using Queues
发表于 2016-11-10
| 分类于
Leetcode
Leetcode 题解 - 234. Palindrome Linked List
发表于 2016-11-08
| 分类于
Leetcode
Leetcode 题解 - 88. Merge Sorted Array
发表于 2016-11-07
| 分类于
Leetcode
Leetcode 题解 - 219. Contains Duplicate II
发表于 2016-11-07
| 分类于
Leetcode
题目
给定一个整数数组 nums 和一个整数 k,判断是否存在两个不同的索引 i, j,使得 nums[i] = nums[j],且 i, j 之差最多为 k。
难度:容易
编程语言:C++
分析
程序框架为:
|
|
我的思路是:
- 取 i = 0,j = k,判断是否 nums[i] = nums[j],是则 return true,否则 i, j 分别 +1,重复本步骤直到 j = nums.size()-1。
- 来到第 2 步,说明没有找到两个不同的索引 i, j,使得 nums[i] = nums[j],且 i, j 之差为 k,所以 k -= 1,继续第 1 步,直到 k = 1。
代码如下:
|
|
提交到 Leetcode,Time Limit Exceeded! 导致超时的输入为 nums = { 0, 1, 2, 3, …, 29999 },k = 15000。上面代码的时间复杂度为 O(n^2)。
那就换个思路,每遍历 nums 一个元素,放到 map<int, int>
里,key 为元素值,value 为元素索引。如果当前元素不存在于 map,那么 添加到 map。如果已存在于 map,判断两个索引之差是否 <= k,如果是 retur true,否则更新 value 值。
代码如下:
|
|
提交到 Leetcode,Accepted! :) 运行时间为 79ms。
注意上面程序的第 21 行,map.find 的时间复杂度为 O(logN),所以整个程序的时间复杂度为 O(NlogN)。
参考资料
Leetcode 题解 - 20. Valid Parentheses
发表于 2016-11-04
| 分类于
Leetcode
Leetcode 题解 - 290. Word Pattern
发表于 2016-11-03
| 分类于
Leetcode
题目
给定一个模式 pattern 和一个字符串 str,判断 str 是否与 pattern 的模式一致。
这里的模式一致表示完全匹配,即 pattern 里的一个字符与 str 里的一个非空单词存在双向映射关系。
Leetcode 题解 - 223. Rectangle Area
发表于 2016-11-02
| 分类于
Leetcode
Leetcode 题解 - 19. Remove Nth Node From End of List
发表于 2016-10-31
| 分类于
Leetcode
Leetcode 题解 - 38. Count and Say
发表于 2016-10-30
| 分类于
Leetcode
题目
count-and-say 序列是形如这样的序列:1, 11, 21, 1211, 111221, …
- 1 读作“一个 1”或“11”
- 11 读作“两个 1” 或“21”
- 21 读作“一个 2”,然后“一个 1”,或“1211”。
给定一个整数 n,生成第 n 个 cout-and-say 序列。