Skip to content

Commit 3b59391

Browse files
committed
20190222
1 parent 7d90c4b commit 3b59391

File tree

5 files changed

+166
-0
lines changed

5 files changed

+166
-0
lines changed

.gitignore

+1
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
11
.DS_Store
22
*/.DS_Store
3+
/kickstart/*
34
test.java

code/lc162.java

+48
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,48 @@
1+
package code;
2+
/*
3+
* 162. Find Peak Element
4+
* 题意:找出数组中任意一个山顶点,时间复杂度O(lg(n)),山顶点指该数左右两边都的数都小于他
5+
* 难度:Medium
6+
* 分类:Array, Binary Search
7+
* 思路:二分查找,想好左右两边递归判断。只有nums[mid]<nums[mid+1],说名右半边就存在峰值
8+
* Tips:
9+
*/
10+
public class lc162 {
11+
public int findPeakElement(int[] nums) {
12+
int[] nums2 = new int[nums.length+2]; //左右加了个最小值
13+
for (int i = 0; i < nums.length ; i++) {
14+
nums2[i+1] = nums[i];
15+
}
16+
nums2[0] = Integer.MIN_VALUE;
17+
nums2[nums2.length-1] = Integer.MIN_VALUE;
18+
return helper(nums2, 1, nums2.length-2)-1;
19+
}
20+
public int helper(int[] nums, int left, int right){
21+
System.out.println(nums.length);
22+
while(left<=right){
23+
int mid = (left+right)/2;
24+
if(nums[mid]>nums[mid+1]&&nums[mid]>nums[mid-1]) return mid;
25+
if(nums[mid]<nums[mid+1]){
26+
left = mid+1;
27+
}else{
28+
right = mid-1;
29+
}
30+
}
31+
return left;
32+
}
33+
34+
public int findPeakElement2(int[] nums) { //第二种方法不用左右加个边界
35+
return helper2(nums, 0, nums.length-1);
36+
}
37+
public int helper2(int[] nums, int left, int right){
38+
while(left<right){ //这没有==
39+
int mid = (left+right)/2;
40+
if(nums[mid]<nums[mid+1]){
41+
left = mid+1;
42+
}else{
43+
right = mid; //这没有-1
44+
}
45+
}
46+
return left;
47+
}
48+
}

code/lc166.java

+39
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
package code;
2+
3+
import java.util.HashMap;
4+
5+
/*
6+
* 166. Fraction to Recurring Decimal
7+
* 题意:实现除法,循环小数部分用()括起来
8+
* 难度:Medium
9+
* 分类:Hash Table, Math
10+
* 思路:首先计算整数部分,然后加上小数点,再计算小数部分
11+
* 用 Hash Table 记录之前的余数,余数相同表示小数点开始循环。
12+
* 注意符号和溢出的情况
13+
* Tips:看似简单的题,并不好写
14+
*/
15+
public class lc166 {
16+
public String fractionToDecimal(int numerator, int denominator) {
17+
StringBuilder sb = new StringBuilder();
18+
if( (numerator>0&&denominator<0) || (numerator<0&&denominator>0)) sb.append("-"); //符号
19+
long num = Math.abs((long)numerator); //用long防止溢出
20+
long den = Math.abs((long)denominator);
21+
sb.append(num/den); //整数部分
22+
23+
HashMap<Long, Integer> hm = new HashMap(); //key存储余数,余数>0 <9, value存储index,用来加(
24+
long n = num%den;
25+
if(n!=0) sb.append(".");
26+
while( n!=0 && !hm.containsKey(n)){
27+
hm.put(n, sb.length());
28+
n = n*10;
29+
sb.append(n/den);
30+
n = n%den;
31+
}
32+
if(hm.containsKey(n)){
33+
int index = hm.get(n);
34+
sb.insert(index, "(");
35+
sb.append(")");
36+
}
37+
return sb.toString();
38+
}
39+
}

code/lc179.java

+35
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
package code;
2+
/*
3+
* 179. Largest Number
4+
* 题意:给一个由数字组成的数组,返回排列组合成的最大数
5+
* 难度:Medium
6+
* 分类:Sort
7+
* 思路:两个数字,i+j 与 j+i 比较,排序。
8+
* 学会实现Comparator接口
9+
* Tips:要先转换成string再实现Comparator接口,直接比较字符串,比较数字会报错。。。
10+
*/
11+
import java.util.Arrays;
12+
import java.util.Comparator;
13+
14+
public class lc179 {
15+
public String largestNumber(int[] nums) {
16+
String[] strs = new String[nums.length]; //先转换成string再比较
17+
for (int i = 0; i < strs.length ; i++) {
18+
strs[i] = String.valueOf(nums[i]);
19+
}
20+
Arrays.sort(strs, new Comparator<String>() { // Comparator接口
21+
@Override
22+
public int compare(String i, String j) {
23+
String s1 = i+j; // i+j 与 j+i 比较
24+
String s2 = j+i;
25+
return s2.compareTo(s1);
26+
}
27+
});
28+
if(strs[0].equals("0")) return "0"; //防止"000"的情况
29+
String res = "";
30+
for (String str:strs) {
31+
res+=str;
32+
}
33+
return res;
34+
}
35+
}

code/lc212.java

+43
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,43 @@
1+
package code;
2+
/*
3+
* 212. Word Search II
4+
* 题意:找出字符数组中路径可以拼出的字符串
5+
* 难度:Hard
6+
* 分类:Backtracking, Trie
7+
* 思路:暴力搜索回溯法就可以AC
8+
* 更好的方法是借助字典树数据结构进行剪枝,减少重复的搜索路径
9+
* https://leetcode.com/problems/word-search-ii/discuss/59780/Java-15ms-Easiest-Solution-(100.00)
10+
* Tips:
11+
*/
12+
import java.util.ArrayList;
13+
import java.util.List;
14+
15+
public class lc212 {
16+
public List<String> findWords(char[][] board, String[] words) {
17+
//暴力搜索
18+
List<String> res = new ArrayList<>();
19+
for (int i = 0; i < board.length ; i++) {
20+
for (int j = 0; j < board[0].length ; j++) {
21+
for (int k = 0; k < words.length ; k++) {
22+
char[] str = words[k].toCharArray();
23+
if(dfs(board, i, j, str, 0)&&!res.contains(words[k])) res.add(words[k]); //记得去重
24+
}
25+
}
26+
}
27+
return res;
28+
}
29+
public boolean dfs(char[][] board, int i, int j, char[] str, int index){
30+
if(i<0||j<0||i>=board.length||j>=board[0].length||index>=str.length) return false;
31+
if(board[i][j]==str[index]){
32+
if(index==str.length-1) return true;
33+
board[i][j] = '0';
34+
boolean res = dfs(board, i+1, j, str, index+1)||
35+
dfs(board, i-1, j, str, index+1)||
36+
dfs(board, i, j+1, str, index+1)||
37+
dfs(board, i, j-1, str, index+1); //用res记录结果,重置字符以后再返回
38+
board[i][j] = str[index]; //记得回溯后重置为原来的字符
39+
return res;
40+
}
41+
return false;
42+
}
43+
}

0 commit comments

Comments
 (0)