Skip to content

Commit 414e4bb

Browse files
Merge pull request algorithm001#674 from bugcodes/master
049_week04_homework
2 parents 0ef44f7 + b86872a commit 414e4bb

3 files changed

Lines changed: 145 additions & 1 deletion

File tree

Week_04/id_49/LeetCode_169_49.java

Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,46 @@
1+
package com.v0ex.leetcode;
2+
3+
import java.util.Arrays;
4+
5+
/**
6+
* @author bugcoder
7+
*/
8+
public class LeetCode_169_49 {
9+
10+
public int majorityElement(int[] nums) {
11+
if(nums.length==1||nums.length==2){
12+
return nums[0];
13+
}
14+
Arrays.sort(nums);
15+
int length = nums.length;
16+
int start = 0;
17+
int end = length-1;
18+
int mid = start + (end-start)/2;
19+
if (nums[start] == nums[mid] && nums[mid] == nums[mid+1]){
20+
mid = start;
21+
}
22+
if (nums[end] == nums[mid] && nums[mid] == nums[mid-1]){
23+
mid = end;
24+
}
25+
return nums[mid];
26+
}
27+
28+
/**
29+
* 很有意思的Boyer-Moore投票算法
30+
* @param nums
31+
* @return
32+
*/
33+
public int majorityElementBmVoting(int[] nums) {
34+
int count = 0;
35+
int candidate = 0;
36+
37+
for (int num : nums) {
38+
if (count == 0) {
39+
candidate = num;
40+
}
41+
count += (num == candidate) ? 1 : -1;
42+
}
43+
44+
return candidate;
45+
}
46+
}

Week_04/id_49/LeetCode_720_49.java

Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
1+
package com.v0ex.leetcode;
2+
3+
import java.util.HashSet;
4+
import java.util.Set;
5+
6+
/**
7+
* @author bugcoder
8+
*/
9+
public class LeetCode_720_49 {
10+
11+
/**
12+
* brute force + 剪枝法
13+
* @param words
14+
* @return
15+
*/
16+
public String longestWord(String[] words){
17+
String result = "";
18+
Set<String> set = new HashSet<>();
19+
for(String word : words){
20+
set.add(word);
21+
}
22+
for(String word: words){
23+
//凡是小于目标字符串长度的字符串都不符合要求
24+
if(word.length() < result.length() ||
25+
//长度相等,但是按照字典顺序大于目标字符串长度的也不符合要求
26+
word.length()== result.length()&&word.compareTo(result)>0){
27+
continue;
28+
}
29+
boolean flag = true;
30+
for(int i = 1;i < word.length();i++){
31+
if(!set.contains(word.substring(0,i))){
32+
flag = false;
33+
break;
34+
}
35+
}
36+
if(flag){
37+
result = word;
38+
}
39+
}
40+
return result;
41+
}
42+
}

Week_04/id_49/NOTE.md

Lines changed: 57 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1,57 @@
1-
# 学习笔记
1+
# 学习笔记
2+
## 分治法
3+
4+
分治法的基本步骤:
5+
6+
step1 分解:将原问题分解为若干个规模较小,相互独立,与原问题形式相同的子问题;
7+
8+
step2 解决:若子问题规模较小而容易被解决则直接解,否则递归地解各个子问题
9+
10+
step3 合并:将各个子问题的解合并为原问题的解。
11+
12+
它的一般的算法设计模式如下:
13+
14+
Divide-and-Conquer(P)
15+
16+
1. if |P|≤n0
17+
18+
2. then return(ADHOC(P))
19+
20+
3. 将P分解为较小的子问题 P1 ,P2 ,...,Pk
21+
22+
4. for i←1 to k
23+
24+
5. do yi ← Divide-and-Conquer(Pi) △ 递归解决Pi
25+
26+
6. T ← MERGE(y1,y2,...,yk) △ 合并子问题
27+
28+
7. return(T)
29+
30+
其中|P|表示问题P的规模;n0为一阈值,表示当问题P的规模不超过n0时,问题已容易直接解出,不必再继续分解。ADHOC(P)是该分治法中的基本子算法,用于直接解小规模的问题P。因此,当P的规模不超过n0时直接用算法ADHOC(P)求解。算法MERGE(y1,y2,...,yk)是该分治法中的合并子算法,用于将P的子问题P1 ,P2 ,...,Pk的相应的解y1,y2,...,yk合并为P的解。
31+
32+
可使用分治法求解的一些经典问题
33+
34+
1. 二分搜索
35+
2. 大整数乘法
36+
3. Strassen矩阵乘法
37+
4. 棋盘覆盖
38+
5. 合并排序
39+
6. 快速排序
40+
7. 线性时间选择
41+
8. 最接近点对问题
42+
9. 循环赛日程表
43+
10. 汉诺塔
44+
45+
##贪心算法
46+
47+
贪心算法的基本步骤:
48+
49+
1. 建立数学模型来描述问题。
50+
51+
1. 把求解的问题分成若干个子问题。
52+
53+
1. 对每一子问题求解,得到子问题的局部最优解。
54+
55+
1. 把子问题的解局部最优解合成原来解问题的一个解。
56+
57+
贪心策略适用的前提是:局部最优策略能导致产生全局最优解。实际上,贪心算法适用的情况很少。一般,对一个问题分析是否适用于贪心算法,可以先选择该问题下的几个实际数据进行分析,就可做出判断。

0 commit comments

Comments
 (0)