Skip to content

Commit 73ebf4f

Browse files
committed
[Function add]
1. Add leetcode solutions with tag search.
1 parent eb92959 commit 73ebf4f

File tree

5 files changed

+240
-10
lines changed

5 files changed

+240
-10
lines changed

leetcode/307. Range Sum Query - Mutable.md

Lines changed: 111 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -183,6 +183,117 @@ class NumArray {
183183
}
184184
}
185185
}
186+
/**
187+
* Your NumArray object will be instantiated and called as such:
188+
* NumArray obj = new NumArray(nums);
189+
* obj.update(i,val);
190+
* int param_2 = obj.sumRange(i,j);
191+
*/
192+
```
193+
194+
### Third time
195+
1. BIT
196+
```Java
197+
class NumArray {
198+
private int[] nums;
199+
private int[] bit;
200+
201+
private int lowBit(int x){
202+
return x & (-x);
203+
}
204+
public NumArray(int[] nums) {
205+
this.nums = new int[nums.length + 1];
206+
for(int i = 0; i < nums.length; i++){
207+
this.nums[i + 1] = nums[i];
208+
}
209+
this.bit = new int[nums.length + 1];
210+
for(int i = 1; i < this.nums.length; i++){
211+
for(int j = i - lowBit(i) + 1; j <= i; j++)
212+
this.bit[i] += this.nums[j];
213+
}
214+
}
215+
216+
public void update(int i, int val) {
217+
int diff = val - nums[i + 1];
218+
nums[i + 1] = val;
219+
int index = i + 1;
220+
while(index < nums.length){
221+
bit[index] += diff;
222+
index += lowBit(index);
223+
}
224+
}
225+
226+
private int sum(int i){
227+
int sum = 0;
228+
while(i > 0){
229+
sum += bit[i];
230+
i -= lowBit(i);
231+
}
232+
return sum;
233+
}
234+
public int sumRange(int i, int j) {
235+
return sum(j + 1) - sum(i);
236+
}
237+
}
238+
239+
/**
240+
* Your NumArray object will be instantiated and called as such:
241+
* NumArray obj = new NumArray(nums);
242+
* obj.update(i,val);
243+
* int param_2 = obj.sumRange(i,j);
244+
*/
245+
```
246+
247+
2. Segment Tree
248+
```Java
249+
class NumArray {
250+
private int[] nums;
251+
private int[] segment;
252+
public NumArray(int[] nums) {
253+
if(nums == null || nums.length == 0) return;
254+
this.nums = nums;
255+
this.segment = new int[nums.length << 2 + 1];
256+
insert(1, nums.length, 1);
257+
}
258+
private void insert(int l, int r, int k){
259+
if(l == r) segment[k] = nums[l - 1];
260+
else{
261+
int m = l + ((r - l) >> 1);
262+
insert(l, m, k << 1);
263+
insert(m + 1, r, k << 1 | 1);
264+
segment[k] = segment[k << 1] + segment[k << 1 | 1];
265+
}
266+
}
267+
268+
public void update(int i, int val) {
269+
update(i, val - nums[i], 1, nums.length, 1);
270+
this.nums[i] = val;
271+
}
272+
private void update(int i, int diff, int l, int r, int k){
273+
if(l == r) segment[k] += diff;
274+
else{
275+
int m = l + ((r - l) >> 1);
276+
if((i + 1) <= m) update(i, diff, l, m, k << 1);
277+
if((i + 1) > m) update(i , diff, m + 1, r, k << 1 | 1);
278+
segment[k] = segment[k << 1] + segment[k << 1 | 1];
279+
}
280+
}
281+
282+
public int sumRange(int i, int j) {
283+
return sumRange(i + 1, j + 1, 1, this.nums.length, 1);
284+
}
285+
private int sumRange(int L, int R, int l, int r, int k){
286+
if(l >= L && r <= R) return segment[k];
287+
else{
288+
int m = l + ((r - l) >> 1);
289+
int sum = 0;
290+
if(L <= m) sum += sumRange(L, R, l, m, k << 1);
291+
if(R > m) sum += sumRange(L, R, m + 1, r, k << 1 | 1);
292+
return sum;
293+
}
294+
}
295+
}
296+
186297
/**
187298
* Your NumArray object will be instantiated and called as such:
188299
* NumArray obj = new NumArray(nums);

leetcode/77. Combinations.md

Lines changed: 9 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -68,24 +68,23 @@ class Solution {
6868
```
6969

7070
### Third time
71+
* Method 1: Need to use comparison to remove redundant recursions.
7172
```Java
7273
class Solution {
7374
public List<List<Integer>> combine(int n, int k) {
74-
List<List<Integer>> result = new LinkedList<>();
75-
if(n < 1 || n < k) return result;
76-
dfs(result, k, n, new LinkedList<Integer>(), 1);
75+
List<List<Integer>> result = new ArrayList<>();
76+
dfs(result, k, n, new ArrayList<Integer>(), 1, 0);
7777
return result;
7878
}
79-
private void dfs(List<List<Integer>> result, int k, int n, List<Integer> temp, int index){
80-
if(k == 0){
81-
result.add(new LinkedList<Integer>(temp));
82-
}else if(k > 0){
79+
private void dfs(List<List<Integer>> result, int k, int n, List<Integer> temp, int index, int count){
80+
if(count == k){
81+
result.add(new ArrayList<Integer>(temp));
82+
}else if(count < k && count + (n - index + 1) >= k){
8383
for(int i = index; i <= n; i++){
8484
temp.add(i);
85-
dfs(result, k - 1, n, temp, i + 1);
86-
temp.remove(temp.size() - 1);
85+
dfs(result, k, n, temp, i + 1, count + 1);
86+
temp.remove(count);
8787
}
8888
}
8989
}
9090
}
91-
```
Lines changed: 59 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,59 @@
1+
## 784. Letter Case Permutation
2+
3+
### Question:
4+
Given a string S, we can transform every letter individually to be lowercase or uppercase to create another string. Return a list of all possible strings we could create.
5+
6+
```
7+
Examples:
8+
Input: S = "a1b2"
9+
Output: ["a1b2", "a1B2", "A1b2", "A1B2"]
10+
11+
Input: S = "3z4"
12+
Output: ["3z4", "3Z4"]
13+
14+
Input: S = "12345"
15+
Output: ["12345"]
16+
```
17+
18+
Note:
19+
* S will be a string with length between 1 and 12.
20+
* S will consist only of letters or digits.
21+
22+
### Solution:
23+
* Method 1: backtrace
24+
* Maintain a temp variable to hold state, can use List or StringBuilder.
25+
* Add current possible variable to temp.
26+
* backtrace
27+
* remove current variable from temp and put next possible variable.
28+
```Java
29+
class Solution {
30+
public List<String> letterCasePermutation(String S) {
31+
List<String> result = new ArrayList<>();
32+
if(S.length() == 0){
33+
result.add("");
34+
return result;
35+
}
36+
dfs(result, S.toCharArray(), 0, new StringBuilder());
37+
return result;
38+
}
39+
private void dfs(List<String> result, char[] arr, int index, StringBuilder sb){
40+
if(index == arr.length){
41+
result.add(sb.toString());
42+
}else if(index < arr.length){
43+
if(arr[index] >= '0' && arr[index] <= '9'){
44+
sb.append(arr[index]);
45+
dfs(result, arr, index + 1, sb);
46+
sb.deleteCharAt(index);
47+
}else{
48+
sb.append(Character.toUpperCase(arr[index]));
49+
dfs(result, arr, index + 1, sb);
50+
sb.deleteCharAt(index);
51+
sb.append(Character.toLowerCase(arr[index]));
52+
dfs(result, arr, index + 1, sb);
53+
sb.deleteCharAt(index);
54+
}
55+
}
56+
}
57+
}
58+
```
59+

leetcode/90. Subsets II.md

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -102,4 +102,27 @@ class Solution {
102102
}
103103
}
104104
}
105+
```
106+
107+
### Third time
108+
```Java
109+
class Solution {
110+
public List<List<Integer>> subsetsWithDup(int[] nums) {
111+
List<List<Integer>> result = new LinkedList<>();
112+
if(nums.length == 0) return result;
113+
Arrays.sort(nums);
114+
dfs(result, nums, new LinkedList<Integer>(), 0);
115+
return result;
116+
}
117+
private void dfs(List<List<Integer>> result, int[] nums, List<Integer> temp, int index){
118+
result.add(new LinkedList<>(temp));
119+
for(int i = index; i < nums.length; i++){
120+
while(i > index && i < nums.length && nums[i] == nums[i - 1]) i++;
121+
if(i >= nums.length) break;
122+
temp.add(nums[i]);
123+
dfs(result, nums, temp, i + 1);
124+
temp.remove(temp.size() - 1);
125+
}
126+
}
127+
}
105128
```
Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
## 907. Sum of Subarray Minimums
2+
3+
### Question
4+
Given an array of integers A, find the sum of min(B), where B ranges over every (contiguous) subarray of A.
5+
6+
Since the answer may be large, return the answer modulo 10^9 + 7.
7+
8+
```
9+
Example 1:
10+
11+
Input: [3,1,2,4]
12+
Output: 17
13+
Explanation: Subarrays are [3], [1], [2], [4], [3,1], [1,2], [2,4], [3,1,2], [1,2,4], [3,1,2,4].
14+
Minimums are 3, 1, 2, 4, 1, 1, 2, 1, 1, 1. Sum is 17.
15+
```
16+
17+
Note:
18+
* 1 <= A.length <= 30000
19+
* 1 <= A[i] <= 30000
20+
21+
### Solution
22+
* Method 1: Brutal force O(N^2)
23+
```Java
24+
class Solution {
25+
public int sumSubarrayMins(int[] A) {
26+
if(A == null || A.length == 0) return 0;
27+
long sum = 0;
28+
for(int i = 0; i < A.length; i++){
29+
int min = A[i];
30+
for(int j = i; j < A.length; j++){
31+
min = Math.min(A[j], min);
32+
sum += min;
33+
}
34+
}
35+
return (int)(sum % (Math.pow(10, 9) + 7));
36+
}
37+
}
38+
```

0 commit comments

Comments
 (0)