Skip to content

Commit 5195fab

Browse files
authored
Merge pull request algorithm004-01#388 from liyeping/master
041-Week 02
2 parents cfdb997 + 3b9407a commit 5195fab

2 files changed

Lines changed: 101 additions & 0 deletions

File tree

Week 02/id_041/Combinations.java

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
package combinations;
2+
3+
import java.util.ArrayList;
4+
import java.util.List;
5+
import java.util.Stack;
6+
7+
/**
8+
*
9+
* 给定两个整数 n 和 k,返回 1 ... n 中所有可能的 k 个数的组合。
10+
* */
11+
class Solution {
12+
List<List<Integer>> res = new ArrayList<>();
13+
public List<List<Integer>> combine(int n, int k) {
14+
//特殊情况判断
15+
if(n <= 0 || k <= 0 || n < k) return res;
16+
findCombinations(n,k,1,new Stack<>());
17+
return res;
18+
}
19+
20+
private void findCombinations(int n, int k, int index, Stack<Integer> s) {
21+
if(s.size() == k){
22+
res.add(new ArrayList<>(s));
23+
return;
24+
}
25+
// k - s.size() 为剩下需要寻找的个数
26+
for (int i = index; i <= n - (k - s.size())+1;i++){
27+
s.push(i);
28+
findCombinations(n,k,i+1,s);
29+
s.pop();
30+
}
31+
}
32+
}
Lines changed: 69 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,69 @@
1+
package majorityElement;
2+
3+
import java.util.HashMap;
4+
import java.util.Map;
5+
6+
/**
7+
*
8+
给定一个大小为 n 的数组,找到其中的众数。众数是指在数组中出现次数大于 ⌊ n/2 ⌋ 的元素。
9+
你可以假设数组是非空的,并且给定的数组总是存在众数。
10+
11+
示例 1:
12+
13+
输入: [3,2,3]
14+
输出: 3
15+
示例 2:
16+
17+
输入: [2,2,1,1,1,2,2]
18+
输出: 2
19+
*
20+
* */
21+
class Solution {
22+
public int majorityElement(int[] nums) {
23+
//分治
24+
return majorityElementEc(nums,0,nums.length-1);
25+
26+
}
27+
28+
private int majorityElementEc(int[] nums, int lo, int hi) {
29+
// terminator
30+
if(lo == hi) return nums[lo];
31+
// process current logic
32+
int mid = (hi-lo)/2+lo;
33+
int left = majorityElementEc(nums,lo,mid);
34+
int right = majorityElementEc(nums,mid+1,hi);
35+
if(left == right) return left;
36+
// merge
37+
int leftCount = countInRange(nums,left,lo,mid);
38+
int rightCount = countInRange(nums,right,mid,hi);
39+
40+
return leftCount > rightCount ? left : right;
41+
42+
43+
}
44+
45+
private int countInRange(int[] nums, int num, int lo, int hi) {
46+
int count = 0;
47+
for (int i = lo; i <= hi ; i++){
48+
if(nums[i] == num) count++;
49+
}
50+
return count;
51+
}
52+
// public int majorityElement(int[] nums) {
53+
// //哈希表法
54+
// //将数组内的元素及重复个数存放在map中
55+
// Map<Integer,Integer> map = new HashMap<>();
56+
// //map中最大元素及个数存放
57+
// int maxNum = 0; int maxCount = 0;
58+
// //遍历元素
59+
// for(int num : nums){
60+
// int count = map.getOrDefault(num,0)+1;
61+
// map.put(num,count);
62+
// if(count > maxCount){
63+
// maxNum = num;
64+
// maxCount = count;
65+
// }
66+
// }
67+
// return maxNum;
68+
// }
69+
}

0 commit comments

Comments
 (0)