SJCHEN

时光,不会辜负每一个平静努力的人

0%

什么是贪心算法呢?贪心算法可以认为是动态规划算法的一个特例,相比动态规划,使用贪心算法需要满足更多的条件(贪心选择性质),但是效率比动态规划要高。

比如说一个算法问题使用暴力解法需要指数级时间,如果能使用动态规划消除重叠子问题,就可以降到多项式级别的时间,如果满足贪心选择性质,那么可以进一步降低时间复杂度,达到线性级别的。

什么是贪心选择性质呢,简单说就是:每一步都做出一个局部最优的选择,最终的结果就是全局最优。注意哦,这是一种特殊性质,其实只有一小部分问题拥有这个性质。

比如你面前放着 100 张人民币,你只能拿十张,怎么才能拿最多的面额?显然每次选择剩下钞票中面值最大的一张,最后你的选择一定是最优的。

阅读全文 »

一般·而言,class 由两部分组成:一组公开的(public)操作函数和运算符,以及一组私有的(private)实现细节。

4.1 如何实现一个 Class

一般而言,我们会从所谓的抽象开始。我们以栈(stack)为例,栈是一种后进先出。

Class定义由两部分组成:class 的声明,以及紧接在声明之后的主体。主体部分由一对大括号括住,并以分号结尾。主体内的两个关键字publicprivate,用来标示每个块的"menber 访问权限"。Public menmber 可以在程序的任何地方被访问,private menber 只能在

member function或是 class fried内被访问。

阅读全文 »

区间问题就是线段问题,让你合并所有线段,找出线段的交集等。主要有两个技巧:

1,排序: 常见的排序方法就是按照区间起点排序,或者先按照起点升序排序,若起点相同,则按照终点降序排列。

2,画图: 画图可以更直观的看出两个区间的相对位置到底有几种可能,不同的相对位置,我们应该如何去解决。

阅读全文 »

BFS相对DFS的最主要的区别是:BFS找到的路径一定是最短的,但代价就是空间复杂度可能比DFS大很多。我们后面可以看出来,这里先介绍下BFS框架。

阅读全文 »

计算机系统由硬件系统软件组成。

1
2
3
4
5
6
#include <stdio.h>

int main(){
printf("hello, world\n");
return 0;
}

1.1 信息就是位 + 上下文

hello 程序的生命周期是从一个源程序(源文件)开始的,文件名为hello.c。源程序实际就是由一个值为 0 和 1 组成的位(比特)序列,8 个位被组织为一组,称为字节

大部分的现代计算机系统都使用 ASCII 标准来表示文本字符。

阅读全文 »

转骰子

骰子是一个正方体,每个面有一个数字,初始为左1,右2,前3,后4,上5,下6,用123456表示这个状态,放置在平面上,可以向左翻转(用L表示向左翻转1次);可以向右翻转(用R表示向右翻转1次);可以向前翻转(用F表示向前翻转1次);可以向后翻转(用B表示向后翻转1次);可以逆时针翻转(用A表示向逆时针翻转1次);可以向顺时针翻转(用C表示向顺时针翻转1次)

输入一行指令,输出最后骰子的状态

输入
RL
输出
123456
解释:骰子向右转一下,再向左转一下,各面结果相当于不变

阅读全文 »

分苹果

有A,B两个同学想要分苹果。A的想法是使用二进制进行,1 + 1相加不进一位,如(9 + 5 = 1001 +101 = 12)。B同学的想法是使用十进制进行,并且进一位。 会输入两组数据,一组是苹果总数,一组分别是每个苹果的重量。如果让B同学在满足A同学的情况下获取到苹果的总重量且返回,如果不能则返回-1。

输入

3

3 5 6

返回

11

备注:按照A同学的想法 5 + 6 = 3 (101 + 110 = 010)

阅读全文 »

954. 二倍数对数组

给定一个长度为偶数的整数数组 arr,只有对 arr 进行重组后可以满足 “对于每个 0 <= i < len(arr) / 2,都有arr[2 * i + 1] = 2 * arr[2 * i]时,返回 true;否则,返回 false。

示例:

输入:arr = [3,1,3,6]
输出:false

输入:arr = [2,1,2,6]
输出:false

输入:arr = [4,-2,2,-4]
输出:true
解释:可以用 [-2,-4] 和 [2,4] 这两组组成 [-2,-4,2,4] 或是 [2,4,-2,-4]

阅读全文 »