Skip to content

Commit 70f8008

Browse files
committed
Added erlang
1 parent ea51476 commit 70f8008

File tree

56 files changed

+3927
-307
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

56 files changed

+3927
-307
lines changed

README.md

+307-307
Large diffs are not rendered by default.
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,58 @@
1+
[![](https://img.shields.io/github/stars/javadev/LeetCode-in-All?label=Stars&style=flat-square)](https://github.com/javadev/LeetCode-in-All)
2+
[![](https://img.shields.io/github/forks/javadev/LeetCode-in-All?label=Fork%20me%20on%20GitHub%20&style=flat-square)](https://github.com/javadev/LeetCode-in-All/fork)
3+
4+
## 1\. Two Sum
5+
6+
Easy
7+
8+
Given an array of integers `nums` and an integer `target`, return _indices of the two numbers such that they add up to `target`_.
9+
10+
You may assume that each input would have **_exactly_ one solution**, and you may not use the _same_ element twice.
11+
12+
You can return the answer in any order.
13+
14+
**Example 1:**
15+
16+
**Input:** nums = [2,7,11,15], target = 9
17+
18+
**Output:** [0,1]
19+
20+
**Output:** Because nums[0] + nums[1] == 9, we return [0, 1].
21+
22+
**Example 2:**
23+
24+
**Input:** nums = [3,2,4], target = 6
25+
26+
**Output:** [1,2]
27+
28+
**Example 3:**
29+
30+
**Input:** nums = [3,3], target = 6
31+
32+
**Output:** [0,1]
33+
34+
**Constraints:**
35+
36+
* <code>2 <= nums.length <= 10<sup>4</sup></code>
37+
* <code>-10<sup>9</sup> <= nums[i] <= 10<sup>9</sup></code>
38+
* <code>-10<sup>9</sup> <= target <= 10<sup>9</sup></code>
39+
* **Only one valid answer exists.**
40+
41+
**Follow-up:** Can you come up with an algorithm that is less than <code>O(n<sup>2</sup>) </code>time complexity?
42+
43+
## Solution
44+
45+
```erlang
46+
% #Easy #Top_100_Liked_Questions #Top_Interview_Questions #Array #Hash_Table
47+
48+
-spec two_sum(Nums :: [integer()], Target :: integer()) -> [integer()].
49+
two_sum(Nums, Target) ->
50+
two_sum(Nums, Target, #{}, 0).
51+
52+
two_sum([], _, _, _) -> undefined;
53+
two_sum([H|T], Target, M, Index) ->
54+
case M of
55+
#{ Target-H := Pair } -> [Pair, Index];
56+
_ -> two_sum(T, Target, M#{ H => Index }, Index + 1)
57+
end.
58+
```
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,66 @@
1+
[![](https://img.shields.io/github/stars/javadev/LeetCode-in-All?label=Stars&style=flat-square)](https://github.com/javadev/LeetCode-in-All)
2+
[![](https://img.shields.io/github/forks/javadev/LeetCode-in-All?label=Fork%20me%20on%20GitHub%20&style=flat-square)](https://github.com/javadev/LeetCode-in-All/fork)
3+
4+
## 2\. Add Two Numbers
5+
6+
Medium
7+
8+
You are given two **non-empty** linked lists representing two non-negative integers. The digits are stored in **reverse order**, and each of their nodes contains a single digit. Add the two numbers and return the sum as a linked list.
9+
10+
You may assume the two numbers do not contain any leading zero, except the number 0 itself.
11+
12+
**Example 1:**
13+
14+
![](https://assets.leetcode.com/uploads/2020/10/02/addtwonumber1.jpg)
15+
16+
**Input:** l1 = [2,4,3], l2 = [5,6,4]
17+
18+
**Output:** [7,0,8]
19+
20+
**Explanation:** 342 + 465 = 807.
21+
22+
**Example 2:**
23+
24+
**Input:** l1 = [0], l2 = [0]
25+
26+
**Output:** [0]
27+
28+
**Example 3:**
29+
30+
**Input:** l1 = [9,9,9,9,9,9,9], l2 = [9,9,9,9]
31+
32+
**Output:** [8,9,9,9,0,0,0,1]
33+
34+
**Constraints:**
35+
36+
* The number of nodes in each linked list is in the range `[1, 100]`.
37+
* `0 <= Node.val <= 9`
38+
* It is guaranteed that the list represents a number that does not have leading zeros.
39+
40+
## Solution
41+
42+
```erlang
43+
%% Definition for singly-linked list.
44+
%%
45+
%% -record(list_node, {val = 0 :: integer(),
46+
%% next = null :: 'null' | #list_node{}}).
47+
48+
-spec add_two_numbers(L1 :: #list_node{} | null, L2 :: #list_node{} | null) -> #list_node{} | null.
49+
add_two_numbers(L1, L2) ->
50+
{Result, _} = add_two_numbers(L1, L2, 0),
51+
Result.
52+
53+
-spec add_two_numbers(L1 :: #list_node{} | null, L2 :: #list_node{} | null, Carry :: integer()) -> {#list_node{} | null, integer()}.
54+
add_two_numbers(null, null, 0) ->
55+
{null, 0};
56+
add_two_numbers(L1, L2, Carry) ->
57+
X = if L1 =/= null -> L1#list_node.val; true -> 0 end,
58+
Y = if L2 =/= null -> L2#list_node.val; true -> 0 end,
59+
Sum = Carry + X + Y,
60+
NewCarry = Sum div 10,
61+
NewNode = #list_node{val = Sum rem 10},
62+
{Next1, _} = if L1 =/= null -> {L1#list_node.next, 0}; true -> {null, 0} end,
63+
{Next2, _} = if L2 =/= null -> {L2#list_node.next, 0}; true -> {null, 0} end,
64+
{NextResult, _} = add_two_numbers(Next1, Next2, NewCarry),
65+
{NewNode#list_node{next = NextResult}, NewCarry}.
66+
```
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,63 @@
1+
[![](https://img.shields.io/github/stars/javadev/LeetCode-in-All?label=Stars&style=flat-square)](https://github.com/javadev/LeetCode-in-All)
2+
[![](https://img.shields.io/github/forks/javadev/LeetCode-in-All?label=Fork%20me%20on%20GitHub%20&style=flat-square)](https://github.com/javadev/LeetCode-in-All/fork)
3+
4+
## 3\. Longest Substring Without Repeating Characters
5+
6+
Medium
7+
8+
Given a string `s`, find the length of the **longest substring** without repeating characters.
9+
10+
**Example 1:**
11+
12+
**Input:** s = "abcabcbb"
13+
14+
**Output:** 3
15+
16+
**Explanation:** The answer is "abc", with the length of 3.
17+
18+
**Example 2:**
19+
20+
**Input:** s = "bbbbb"
21+
22+
**Output:** 1
23+
24+
**Explanation:** The answer is "b", with the length of 1.
25+
26+
**Example 3:**
27+
28+
**Input:** s = "pwwkew"
29+
30+
**Output:** 3
31+
32+
**Explanation:** The answer is "wke", with the length of 3. Notice that the answer must be a substring, "pwke" is a subsequence and not a substring.
33+
34+
**Example 4:**
35+
36+
**Input:** s = ""
37+
38+
**Output:** 0
39+
40+
**Constraints:**
41+
42+
* <code>0 <= s.length <= 5 * 10<sup>4</sup></code>
43+
* `s` consists of English letters, digits, symbols and spaces.
44+
45+
## Solution
46+
47+
```erlang
48+
-spec length_of_longest_substring(S :: unicode:unicode_binary()) -> integer().
49+
length_of_longest_substring(S) ->
50+
do(S, 0, #{}, 0, 1).
51+
52+
do(<<Char, Rest/binary>>, Index, PrevPos, Max, Acc0) when is_map_key(Char, PrevPos) ->
53+
PrevIndex = map_get(Char, PrevPos),
54+
Acc1 = Index - PrevIndex,
55+
Acc = min(Acc1, Acc0),
56+
do(Rest, Index + 1, PrevPos#{Char => Index}, max(Max, Acc), Acc + 1);
57+
do(<<Char, Rest/binary>>, Index, PrevPos, Max, Acc) when Acc > Max ->
58+
do(Rest, Index + 1, PrevPos#{Char => Index}, Acc, Acc + 1);
59+
do(<<Char, Rest/binary>>, Index, PrevPos, Max, Acc) ->
60+
do(Rest, Index + 1, PrevPos#{Char => Index}, Max, Acc + 1);
61+
62+
do(<<>>, _, _, Max, _) -> Max.
63+
```
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,74 @@
1+
[![](https://img.shields.io/github/stars/javadev/LeetCode-in-All?label=Stars&style=flat-square)](https://github.com/javadev/LeetCode-in-All)
2+
[![](https://img.shields.io/github/forks/javadev/LeetCode-in-All?label=Fork%20me%20on%20GitHub%20&style=flat-square)](https://github.com/javadev/LeetCode-in-All/fork)
3+
4+
## 4\. Median of Two Sorted Arrays
5+
6+
Hard
7+
8+
Given two sorted arrays `nums1` and `nums2` of size `m` and `n` respectively, return **the median** of the two sorted arrays.
9+
10+
The overall run time complexity should be `O(log (m+n))`.
11+
12+
**Example 1:**
13+
14+
**Input:** nums1 = [1,3], nums2 = [2]
15+
16+
**Output:** 2.00000
17+
18+
**Explanation:** merged array = [1,2,3] and median is 2.
19+
20+
**Example 2:**
21+
22+
**Input:** nums1 = [1,2], nums2 = [3,4]
23+
24+
**Output:** 2.50000
25+
26+
**Explanation:** merged array = [1,2,3,4] and median is (2 + 3) / 2 = 2.5.
27+
28+
**Example 3:**
29+
30+
**Input:** nums1 = [0,0], nums2 = [0,0]
31+
32+
**Output:** 0.00000
33+
34+
**Example 4:**
35+
36+
**Input:** nums1 = [], nums2 = [1]
37+
38+
**Output:** 1.00000
39+
40+
**Example 5:**
41+
42+
**Input:** nums1 = [2], nums2 = []
43+
44+
**Output:** 2.00000
45+
46+
**Constraints:**
47+
48+
* `nums1.length == m`
49+
* `nums2.length == n`
50+
* `0 <= m <= 1000`
51+
* `0 <= n <= 1000`
52+
* `1 <= m + n <= 2000`
53+
* <code>-10<sup>6</sup> <= nums1[i], nums2[i] <= 10<sup>6</sup></code>
54+
55+
## Solution
56+
57+
```erlang
58+
-spec find_median_sorted_arrays(Nums1 :: [integer()], Nums2 :: [integer()]) -> float().
59+
find_median_sorted_arrays(Nums1, Nums2) ->
60+
Len = length(Nums1) + length(Nums2),
61+
find_median_sorted_arrays(Nums1, Nums2, [], -1, 0, 0, Len rem 2, Len div 2).
62+
find_median_sorted_arrays(_, _, [H|T], Index, _, _, Even, Index) ->
63+
if Even =:= 1 -> H;
64+
true -> (H + lists:nth(1, T)) / 2
65+
end;
66+
find_median_sorted_arrays([], [H2|T2], MyArr, Index, Indx1, Indx2, Even, Middle) ->
67+
find_median_sorted_arrays([], T2, [H2|MyArr], Index + 1, Indx1, Indx2 + 1, Even, Middle);
68+
find_median_sorted_arrays([H1|T1], [], MyArr, Index, Indx1, Indx2, Even, Middle) ->
69+
find_median_sorted_arrays(T1, [], [H1|MyArr], Index + 1, Indx1, Indx2 + 1, Even, Middle);
70+
find_median_sorted_arrays([H1|T1], [H2|T2], MyArr, Index, Indx1, Indx2, Even, Middle) when H1 < H2 ->
71+
find_median_sorted_arrays(T1, [H2|T2], [H1|MyArr], Index + 1, Indx1 + 1, Indx2, Even, Middle);
72+
find_median_sorted_arrays([H1|T1], [H2|T2], MyArr, Index, Indx1, Indx2, Even, Middle)->
73+
find_median_sorted_arrays([H1|T1], T2, [H2|MyArr], Index + 1, Indx1, Indx2 + 1, Even, Middle).
74+
```
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,85 @@
1+
[![](https://img.shields.io/github/stars/javadev/LeetCode-in-All?label=Stars&style=flat-square)](https://github.com/javadev/LeetCode-in-All)
2+
[![](https://img.shields.io/github/forks/javadev/LeetCode-in-All?label=Fork%20me%20on%20GitHub%20&style=flat-square)](https://github.com/javadev/LeetCode-in-All/fork)
3+
4+
## 5\. Longest Palindromic Substring
5+
6+
Medium
7+
8+
Given a string `s`, return _the longest palindromic substring_ in `s`.
9+
10+
**Example 1:**
11+
12+
**Input:** s = "babad"
13+
14+
**Output:** "bab" **Note:** "aba" is also a valid answer.
15+
16+
**Example 2:**
17+
18+
**Input:** s = "cbbd"
19+
20+
**Output:** "bb"
21+
22+
**Example 3:**
23+
24+
**Input:** s = "a"
25+
26+
**Output:** "a"
27+
28+
**Example 4:**
29+
30+
**Input:** s = "ac"
31+
32+
**Output:** "a"
33+
34+
**Constraints:**
35+
36+
* `1 <= s.length <= 1000`
37+
* `s` consist of only digits and English letters.
38+
39+
## Solution
40+
41+
```erlang
42+
-spec longest_palindrome(S :: unicode:unicode_binary()) -> unicode:unicode_binary().
43+
longest_palindrome(S) ->
44+
Length = byte_size(S),
45+
case Length of
46+
0 -> <<>>; % Return empty binary if input is empty
47+
_ ->
48+
% Initialize variables for the best palindrome
49+
{Start, Len} = lists:foldl(
50+
fun(Index, {BestStart, BestLen}) ->
51+
% Find the longest palindrome for odd and even length centers
52+
{NewStart1, NewLen1} = find_longest_palindrome(S, Index, Index),
53+
{NewStart2, NewLen2} = find_longest_palindrome(S, Index, Index + 1),
54+
% Choose the longer of the two found palindromes
55+
case NewLen1 >= NewLen2 of
56+
true -> update_best(BestStart, BestLen, NewStart1, NewLen1);
57+
false -> update_best(BestStart, BestLen, NewStart2, NewLen2)
58+
end
59+
end,
60+
{0, 0}, % Initial best palindrome start and length
61+
lists:seq(0, Length - 1) % Iterate through all positions
62+
),
63+
% Extract the longest palindromic substring
64+
binary:part(S, Start, Len)
65+
end.
66+
67+
% Helper function to find the longest palindrome around the center
68+
-spec find_longest_palindrome(S :: unicode:unicode_binary(), L :: integer(), R :: integer()) -> {integer(), integer()}.
69+
find_longest_palindrome(S, L, R) ->
70+
Length = byte_size(S),
71+
case (L >= 0 andalso R < Length andalso binary:part(S, L, 1) =:= binary:part(S, R, 1)) of
72+
true ->
73+
find_longest_palindrome(S, L - 1, R + 1);
74+
false ->
75+
{L + 1, R - L - 1}
76+
end.
77+
78+
% Helper function to update the best palindrome found so far
79+
-spec update_best(BestStart :: integer(), BestLen :: integer(), NewStart :: integer(), NewLen :: integer()) -> {integer(), integer()}.
80+
update_best(BestStart, BestLen, NewStart, NewLen) ->
81+
case NewLen > BestLen of
82+
true -> {NewStart, NewLen};
83+
false -> {BestStart, BestLen}
84+
end.
85+
```

0 commit comments

Comments
 (0)