更新代码
This commit is contained in:
parent
f4160043bd
commit
f3de6f90d0
88
code/src/main/java/com/raorao/leetcode/q004/FindMedian.java
Normal file
88
code/src/main/java/com/raorao/leetcode/q004/FindMedian.java
Normal file
@ -0,0 +1,88 @@
|
||||
package com.raorao.leetcode.q004;
|
||||
|
||||
/**
|
||||
* 寻找中位数.
|
||||
*
|
||||
* 问题描述:给定两个有序的数组,然后寻找两个有序数组的中位数。
|
||||
*
|
||||
* 利用二分法的思想。时间复杂度为O(log(min(M,N)) 空间复杂度O(1)
|
||||
*
|
||||
* @author Xiong Raorao
|
||||
* @since 2018-08-21-11:57
|
||||
*/
|
||||
public class FindMedian {
|
||||
|
||||
public static void main(String[] args) {
|
||||
int[] nums1 = new int[] {1, 3};
|
||||
int[] nums2 = new int[] {2};
|
||||
System.out.println(new FindMedian().findMedianSortedArrays(nums1, nums2));
|
||||
}
|
||||
|
||||
/*
|
||||
* @param A: An integer array
|
||||
* @param B: An integer array
|
||||
* @return: a double whose format is *.5 or *.0
|
||||
*/
|
||||
public double findMedianSortedArrays(int[] A, int[] B) {
|
||||
int n = A.length + B.length;
|
||||
|
||||
if (n % 2 == 0) {
|
||||
return (findKth(A, B, n / 2) + findKth(A, B, n / 2 + 1)) / 2.0;
|
||||
}
|
||||
|
||||
return findKth(A, B, n / 2 + 1);
|
||||
}
|
||||
|
||||
// k is not zero-based, it starts from 1
|
||||
public int findKth(int[] A, int[] B, int k) {
|
||||
if (A.length == 0) {
|
||||
return B[k - 1];
|
||||
}
|
||||
if (B.length == 0) {
|
||||
return A[k - 1];
|
||||
}
|
||||
|
||||
int start = Math.min(A[0], B[0]);
|
||||
int end = Math.max(A[A.length - 1], B[B.length - 1]);
|
||||
|
||||
// find first x that >= k numbers is smaller or equal to x
|
||||
while (start + 1 < end) {
|
||||
int mid = start + (end - start) / 2;
|
||||
if (countSmallerOrEqual(A, mid) + countSmallerOrEqual(B, mid) < k) {
|
||||
start = mid;
|
||||
} else {
|
||||
end = mid;
|
||||
}
|
||||
}
|
||||
|
||||
if (countSmallerOrEqual(A, start) + countSmallerOrEqual(B, start) >= k) {
|
||||
return start;
|
||||
}
|
||||
|
||||
return end;
|
||||
}
|
||||
|
||||
private int countSmallerOrEqual(int[] arr, int number) {
|
||||
int start = 0, end = arr.length - 1;
|
||||
|
||||
// find first index that arr[index] > number;
|
||||
while (start + 1 < end) {
|
||||
int mid = start + (end - start) / 2;
|
||||
if (arr[mid] <= number) {
|
||||
start = mid;
|
||||
} else {
|
||||
end = mid;
|
||||
}
|
||||
}
|
||||
|
||||
if (arr[start] > number) {
|
||||
return start;
|
||||
}
|
||||
|
||||
if (arr[end] > number) {
|
||||
return end;
|
||||
}
|
||||
|
||||
return arr.length;
|
||||
}
|
||||
}
|
33
code/src/main/java/com/raorao/leetcode/q069/Sqrt.java
Normal file
33
code/src/main/java/com/raorao/leetcode/q069/Sqrt.java
Normal file
@ -0,0 +1,33 @@
|
||||
package com.raorao.leetcode.q069;
|
||||
|
||||
/**
|
||||
* 求开方.
|
||||
*
|
||||
* @author Xiong Raorao
|
||||
* @since 2018-08-21-16:06
|
||||
*/
|
||||
public class Sqrt {
|
||||
|
||||
/**
|
||||
* 二分查找实现开方
|
||||
*/
|
||||
public int mySqrt(int x) {
|
||||
if (x <= 1) {
|
||||
return x;
|
||||
}
|
||||
int low = 0;
|
||||
int high = x;
|
||||
while (low <= high) {
|
||||
int mid = low + (high - low) / 2;
|
||||
int sqrt = x / mid;
|
||||
if (sqrt == mid) {
|
||||
return mid;
|
||||
} else if (mid > sqrt) {
|
||||
high = mid - 1;
|
||||
} else {
|
||||
low = mid + 1;
|
||||
}
|
||||
}
|
||||
return high;
|
||||
}
|
||||
}
|
45
code/src/main/java/com/raorao/leetcode/q075/SortColor.java
Normal file
45
code/src/main/java/com/raorao/leetcode/q075/SortColor.java
Normal file
@ -0,0 +1,45 @@
|
||||
package com.raorao.leetcode.q075;
|
||||
|
||||
import java.util.Arrays;
|
||||
|
||||
/**
|
||||
* 荷兰国旗问题.
|
||||
*
|
||||
* 给定一个包含红色、白色和蓝色,一共 n 个元素的数组,原地对它们进行排序,使得相同颜色的元素相邻,并按照红色、白色、蓝色顺序排列。
|
||||
*
|
||||
* 它其实是三向切分快速排序的一种变种,在三向切分快速排序中,每次切分都将数组分成三个区间: 小于切分元素、等于切分元素、大于切分元素,而该算法是将数组分成三个区间:等于红色、等于白色、等于蓝色。
|
||||
*
|
||||
* 题目描述只有0/1/2三种颜色,分别对应红白蓝
|
||||
*
|
||||
* @author Xiong Raorao
|
||||
* @since 2018-08-21-9:34
|
||||
*/
|
||||
public class SortColor {
|
||||
|
||||
public static void main(String[] args) {
|
||||
int[] input = new int[] {2,0,1};
|
||||
new SortColor().sortColors(input);
|
||||
Arrays.stream(input).forEach(e -> System.out.print(e + " "));
|
||||
}
|
||||
|
||||
public void sortColors(int[] nums) {
|
||||
int low = 0;
|
||||
int high = nums.length - 1;
|
||||
int pivot = 0;
|
||||
while (pivot <= high) {
|
||||
if (nums[pivot] == 0) {
|
||||
swap(nums, pivot++, low++); // 如果把当前0换到前面去了,换过来的只可能是1或0,因此pivot右移
|
||||
} else if (nums[pivot] == 2) {
|
||||
swap(nums, pivot, high--); // 如果是2和末尾的交换,可能过来的是0,因此pivot不能右移
|
||||
} else {
|
||||
pivot++;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private void swap(int[] arr, int i, int j) {
|
||||
int tmp = arr[i];
|
||||
arr[i] = arr[j];
|
||||
arr[j] = tmp;
|
||||
}
|
||||
}
|
46
code/src/main/java/com/raorao/leetcode/q153/FindMin.java
Normal file
46
code/src/main/java/com/raorao/leetcode/q153/FindMin.java
Normal file
@ -0,0 +1,46 @@
|
||||
package com.raorao.leetcode.q153;
|
||||
|
||||
/**
|
||||
* 旋转后的有序数组的最小数字.
|
||||
*
|
||||
* 当年拼多多二面的算法题啊
|
||||
*
|
||||
* @author Xiong Raorao
|
||||
* @since 2018-08-21-16:33
|
||||
*/
|
||||
public class FindMin {
|
||||
|
||||
public static void main(String[] args) {
|
||||
int[] input = new int[] {4, 5, 6, 7, 0, 1, 2};
|
||||
int res = findMin(input);
|
||||
System.out.println(res);
|
||||
}
|
||||
|
||||
public static int findMin(int[] nums) {
|
||||
int low = 0;
|
||||
int high = nums.length - 1;
|
||||
while (low < high) {
|
||||
int mid = low + (high - low) / 2;
|
||||
if (nums[mid] <= nums[high]) {
|
||||
high = mid;
|
||||
} else {
|
||||
low = mid + 1;
|
||||
}
|
||||
}
|
||||
return nums[low];
|
||||
}
|
||||
|
||||
public static int findMax(int[] nums) {
|
||||
int low = 0;
|
||||
int high = nums.length - 1;
|
||||
while (low < high) {
|
||||
int mid = low + (high - low) / 2;
|
||||
if (nums[mid] >= nums[low]) {
|
||||
low = mid;
|
||||
} else {
|
||||
high = mid - 1;
|
||||
}
|
||||
}
|
||||
return nums[high];
|
||||
}
|
||||
}
|
@ -0,0 +1,54 @@
|
||||
package com.raorao.leetcode.q241;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
* 给表达式加括号.
|
||||
*
|
||||
* 分治法
|
||||
*
|
||||
* @author Xiong Raorao
|
||||
* @since 2018-08-21-17:01
|
||||
*/
|
||||
public class ExpressCompute {
|
||||
|
||||
public static void main(String[] args) {
|
||||
String input = "2-1-1";
|
||||
List<Integer> res = diffWaysToCompute(input);
|
||||
res.forEach(e-> System.out.print(e+" "));
|
||||
}
|
||||
|
||||
public static List<Integer> diffWaysToCompute(String input) {
|
||||
List<Integer> items = new ArrayList<>();
|
||||
for (int i = 0; i < input.length(); i++) {
|
||||
if (isChar(input, i)) {
|
||||
List<Integer> left = diffWaysToCompute(input.substring(0, i));
|
||||
List<Integer> right = diffWaysToCompute(input.substring(i + 1));
|
||||
for (int l : left) {
|
||||
for (int r : right) {
|
||||
switch (input.charAt(i)) {
|
||||
case '+':
|
||||
items.add(l + r);
|
||||
break;
|
||||
case '-':
|
||||
items.add(l - r);
|
||||
break;
|
||||
case '*':
|
||||
items.add(l * r);
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
if (items.size() == 0) {
|
||||
items.add(Integer.parseInt(input));
|
||||
}
|
||||
return items;
|
||||
}
|
||||
|
||||
private static boolean isChar(String input, int i) {
|
||||
return input.charAt(i) == '+' || input.charAt(i) == '-' || input.charAt(i) == '*';
|
||||
}
|
||||
}
|
@ -0,0 +1,39 @@
|
||||
package com.raorao.leetcode.q347;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.Arrays;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.TreeMap;
|
||||
import java.util.stream.Collectors;
|
||||
|
||||
/**
|
||||
* 前K个出现频率最高的元素.
|
||||
*
|
||||
* @author Xiong Raorao
|
||||
* @since 2018-08-21-8:55
|
||||
*/
|
||||
public class TopKFrequent {
|
||||
|
||||
public static void main(String[] args) {
|
||||
int[] input = new int[] {1, 1, 1, 2, 2, 3};
|
||||
int k = 2;
|
||||
List<Integer> list = new TopKFrequent().topKFrequent(input, k);
|
||||
list.forEach(e -> System.out.print(e + " "));
|
||||
}
|
||||
|
||||
/**
|
||||
* 对map的value进行降序排列,得到前K个就行了
|
||||
*/
|
||||
public List<Integer> topKFrequent(int[] nums, int k) {
|
||||
List<Integer> ret = new ArrayList<>();
|
||||
TreeMap<Integer, Integer> map = new TreeMap<>();
|
||||
Arrays.stream(nums).forEach(e -> map.put(e, map.getOrDefault(e, 0) + 1));
|
||||
List<Map.Entry<Integer, Integer>> tmp = map.entrySet().stream()
|
||||
.sorted((e1, e2) -> e2.getValue() - e1.getValue()).collect(Collectors.toList());
|
||||
for (int i = 0; i < k; i++) {
|
||||
ret.add(tmp.get(i).getKey());
|
||||
}
|
||||
return ret;
|
||||
}
|
||||
}
|
44
code/src/main/java/com/raorao/leetcode/q392/SubSequence.java
Normal file
44
code/src/main/java/com/raorao/leetcode/q392/SubSequence.java
Normal file
@ -0,0 +1,44 @@
|
||||
package com.raorao.leetcode.q392;
|
||||
|
||||
/**
|
||||
* 判断是否为子序列.
|
||||
*
|
||||
* @author Xiong Raorao
|
||||
* @since 2018-08-21-15:13
|
||||
*/
|
||||
public class SubSequence {
|
||||
|
||||
public static void main(String[] args) {
|
||||
String s = "abc";
|
||||
String t = "ahbgdc";
|
||||
System.out.println(new SubSequence().isSubsequence2(s, t));
|
||||
}
|
||||
|
||||
/**
|
||||
* 贪心法,一个一个检索
|
||||
*/
|
||||
public boolean isSubsequence(String s, String t) {
|
||||
int index = -1;
|
||||
for (char c : s.toCharArray()) {
|
||||
index = t.indexOf(c, index + 1);
|
||||
if (index == -1) {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
public boolean isSubsequence2(String s, String t) {
|
||||
int is = 0;
|
||||
int it = 0;
|
||||
while (is < s.length() && it < t.length()) {
|
||||
if (s.charAt(is) == t.charAt(it)) {
|
||||
is++;
|
||||
it++;
|
||||
} else {
|
||||
it++;
|
||||
}
|
||||
}
|
||||
return is == s.length();
|
||||
}
|
||||
}
|
37
code/src/main/java/com/raorao/leetcode/q605/PlantFlower.java
Normal file
37
code/src/main/java/com/raorao/leetcode/q605/PlantFlower.java
Normal file
@ -0,0 +1,37 @@
|
||||
package com.raorao.leetcode.q605;
|
||||
|
||||
/**
|
||||
* 种植花朵.
|
||||
*
|
||||
* 问题描述;花朵之间至少需要一个单位的间隔,求解是否能种下 n 朵花。
|
||||
*
|
||||
* @author Xiong Raorao
|
||||
* @since 2018-08-21-11:40
|
||||
*/
|
||||
public class PlantFlower {
|
||||
|
||||
public static void main(String[] args) {
|
||||
int[] input = new int[] {1, 0, 0, 0, 1};
|
||||
int n = 1;
|
||||
System.out.println(new PlantFlower().canPlaceFlowers(input, n));
|
||||
}
|
||||
|
||||
public boolean canPlaceFlowers(int[] flowerbed, int n) {
|
||||
if (flowerbed == null || flowerbed.length == 0) {
|
||||
return false;
|
||||
}
|
||||
int count = 0; // 统计最多能种多少棵
|
||||
for (int i = 0; i < flowerbed.length && count < n; i++) {
|
||||
if (flowerbed[i] == 1) {
|
||||
continue;
|
||||
}
|
||||
int pre = i == 0 ? 0 : flowerbed[i - 1];
|
||||
int next = i == flowerbed.length - 1 ? 0 : flowerbed[i + 1];
|
||||
if (pre == 0 && next == 0) {
|
||||
count++;
|
||||
flowerbed[i] = 1;
|
||||
}
|
||||
}
|
||||
return count >= n;
|
||||
}
|
||||
}
|
@ -0,0 +1,29 @@
|
||||
package com.raorao.leetcode.q665;
|
||||
|
||||
/**
|
||||
* 判断是否为非递减数组.
|
||||
*
|
||||
* 题目描述:判断一个数组能不能只修改一个数就成为非递减数组。
|
||||
*
|
||||
* @author Xiong Raorao
|
||||
* @since 2018-08-21-15:44
|
||||
*/
|
||||
public class NoneDecreasingArray {
|
||||
|
||||
public boolean checkPossibility(int[] nums) {
|
||||
int count = 0; // 修改次数
|
||||
for (int i = 1; i < nums.length && count < 2; i++) {
|
||||
if (nums[i] >= nums[i - 1]) {
|
||||
continue;
|
||||
}
|
||||
count++;
|
||||
if (i > 1 && nums[i] < nums[i - 2]) {
|
||||
nums[i] = nums[i - 1];
|
||||
} else {
|
||||
nums[i - 1] = nums[i];
|
||||
}
|
||||
}
|
||||
return count < 2;
|
||||
}
|
||||
|
||||
}
|
@ -0,0 +1,24 @@
|
||||
package com.raorao.leetcode.q744;
|
||||
|
||||
/**
|
||||
* 寻找大于给定元素的最小元素.
|
||||
*
|
||||
* @author Xiong Raorao
|
||||
* @since 2018-08-21-16:23
|
||||
*/
|
||||
public class NextGreatestLetter {
|
||||
|
||||
public char nextGreatestLetter(char[] letters, char target) {
|
||||
int n = letters.length;
|
||||
int l = 0, h = n - 1;
|
||||
while (l <= h) {
|
||||
int m = l + (h - l) / 2;
|
||||
if (letters[m] <= target) {
|
||||
l = m + 1;
|
||||
} else {
|
||||
h = m - 1;
|
||||
}
|
||||
}
|
||||
return l < n ? letters[l] : letters[0];
|
||||
}
|
||||
}
|
@ -0,0 +1,48 @@
|
||||
package com.raorao.leetcode.q763;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.HashMap;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
|
||||
/**
|
||||
* 划分字母区间.
|
||||
*
|
||||
* 输入:划分字母区间来控制
|
||||
*
|
||||
* @author Xiong Raorao
|
||||
* @since 2018-08-21-10:53
|
||||
*/
|
||||
public class SplitLetters {
|
||||
|
||||
public static void main(String[] args) {
|
||||
String input = "ababcbacadefegdehijhklij";
|
||||
List<Integer> list = new SplitLetters().partitionLabels(input);
|
||||
list.forEach(e -> System.out.print(e + " "));
|
||||
}
|
||||
|
||||
public List<Integer> partitionLabels(String S) {
|
||||
List<Integer> ret = new ArrayList<>();
|
||||
if (S == null || S.length() == 0) {
|
||||
return ret;
|
||||
}
|
||||
Map<Character, Integer> map = new HashMap<>(); // 统计每个字符最后出现的位置
|
||||
for (int i = 0; i < S.length(); i++) {
|
||||
map.put(S.charAt(i), i);
|
||||
}
|
||||
|
||||
int firstIndex = 0;
|
||||
while (firstIndex < S.length()) {
|
||||
int lastIndex = firstIndex;
|
||||
for (int i = firstIndex; i < S.length() && i <= lastIndex; i++) {
|
||||
int index = map.get(S.charAt(i));
|
||||
if (index > lastIndex) {
|
||||
lastIndex = index;
|
||||
}
|
||||
}
|
||||
ret.add(lastIndex - firstIndex + 1);
|
||||
firstIndex = lastIndex + 1;
|
||||
}
|
||||
return ret;
|
||||
}
|
||||
}
|
@ -37,6 +37,7 @@ Java后端开发(大数据、分布式应用等)
|
||||
招银网络 | 8.7(内推) | 8.20 |
|
||||
小米科技 | 8.20(柚子妹内推) | 8.20 | 时间不详
|
||||
京东 | 8.4 | 8.20 | <li>简历截止:8.30</li><li>笔试时间 9.9</li><li>面试时间 9.16-9.20</li>
|
||||
微众银行| 8.20 | 8.20 |
|
||||
|
||||
|
||||
# 2 复习内容
|
||||
|
Loading…
x
Reference in New Issue
Block a user