Skip to content

Commit

Permalink
Added C solutions
Browse files Browse the repository at this point in the history
  • Loading branch information
javadev committed Nov 9, 2024
1 parent 1b66125 commit 1b65318
Show file tree
Hide file tree
Showing 210 changed files with 9,058 additions and 383 deletions.
762 changes: 381 additions & 381 deletions README.md

Large diffs are not rendered by default.

5 changes: 3 additions & 2 deletions pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@
<groupId>com.github.javadev</groupId>
<artifactId>leetcode-in-all</artifactId>
<packaging>jar</packaging>
<version>1.4</version>
<version>1.5</version>
<name>leetcode-in-all</name>
<description>104 LeetCode algorithm problem solutions</description>
<url>https://github.com/javadev/LeetCode-in-All</url>
Expand Down Expand Up @@ -93,6 +93,7 @@
<source>src/main/elixir</source>
<source>src/main/rust</source>
<source>src/main/dart</source>
<source>src/main/c</source>
</sources>
</configuration>
</execution>
Expand Down Expand Up @@ -131,7 +132,7 @@
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-gpg-plugin</artifactId>
<version>3.2.7</version>
<version>1.6</version>
<executions>
<execution>
<id>sign-artifacts</id>
Expand Down
24 changes: 24 additions & 0 deletions src/main/c/g0001_0100/s0001_two_sum/Solution.c
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
// #Easy #Top_100_Liked_Questions #Top_Interview_Questions #Array #Hash_Table
// #Data_Structure_I_Day_2_Array #Level_1_Day_13_Hashmap #Udemy_Arrays #Big_O_Time_O(n)_Space_O(n)
// #AI_can_be_used_to_solve_the_task #2024_10_16_Time_2_ms_(99.56%)_Space_8.6_MB_(40.96%)

/**
* Note: The returned array must be malloced, assume caller calls free().
*/
int* twoSum(int* nums, int numsSize, int target, int* returnSize) {
returnSize[0] = 2;
int* output = (int*)malloc(sizeof(int) * 2);

for (int offset = 1; offset < numsSize; offset++) {
int i = 0;
while (i + offset < numsSize) {
if (nums[i] + nums[i + offset] == target) {
output[0] = i;
output[1] = i + offset;
return output;
}
i++;
}
}
return (void*)0;
}
38 changes: 38 additions & 0 deletions src/main/c/g0001_0100/s0001_two_sum/readme.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,38 @@
1\. Two Sum

Easy

Given an array of integers `nums` and an integer `target`, return _indices of the two numbers such that they add up to `target`_.

You may assume that each input would have **_exactly_ one solution**, and you may not use the _same_ element twice.

You can return the answer in any order.

**Example 1:**

**Input:** nums = [2,7,11,15], target = 9

**Output:** [0,1]

**Output:** Because nums[0] + nums[1] == 9, we return [0, 1].

**Example 2:**

**Input:** nums = [3,2,4], target = 6

**Output:** [1,2]

**Example 3:**

**Input:** nums = [3,3], target = 6

**Output:** [0,1]

**Constraints:**

* <code>2 <= nums.length <= 10<sup>4</sup></code>
* <code>-10<sup>9</sup> <= nums[i] <= 10<sup>9</sup></code>
* <code>-10<sup>9</sup> <= target <= 10<sup>9</sup></code>
* **Only one valid answer exists.**

**Follow-up:** Can you come up with an algorithm that is less than <code>O(n<sup>2</sup>) </code>time complexity?
53 changes: 53 additions & 0 deletions src/main/c/g0001_0100/s0002_add_two_numbers/Solution.c
Original file line number Diff line number Diff line change
@@ -0,0 +1,53 @@
// #Medium #Top_100_Liked_Questions #Top_Interview_Questions #Math #Linked_List #Recursion
// #Data_Structure_II_Day_10_Linked_List #Programming_Skills_II_Day_15
// #Big_O_Time_O(max(N,M))_Space_O(max(N,M)) #AI_can_be_used_to_solve_the_task
// #2024_10_16_Time_12_ms_(70.50%)_Space_12.6_MB_(56.73%)

/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* struct ListNode *next;
* };
*/
// Function to create a new ListNode
struct ListNode* createNode(int val) {
struct ListNode* newNode = (struct ListNode*)malloc(sizeof(struct ListNode));
newNode->val = val;
newNode->next = NULL;
return newNode;
}

struct ListNode* addTwoNumbers(struct ListNode* l1, struct ListNode* l2) {
struct ListNode dummyHead;
dummyHead.val = 0;
dummyHead.next = NULL;

struct ListNode* p = l1;
struct ListNode* q = l2;
struct ListNode* curr = &dummyHead;
int carry = 0;

while (p != NULL || q != NULL) {
int x = (p != NULL) ? p->val : 0;
int y = (q != NULL) ? q->val : 0;
int sum = carry + x + y;
carry = sum / 10;

curr->next = createNode(sum % 10);
curr = curr->next;

if (p != NULL) {
p = p->next;
}
if (q != NULL) {
q = q->next;
}
}

if (carry > 0) {
curr->next = createNode(carry);
}

return dummyHead.next;
}
35 changes: 35 additions & 0 deletions src/main/c/g0001_0100/s0002_add_two_numbers/readme.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
2\. Add Two Numbers

Medium

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.

You may assume the two numbers do not contain any leading zero, except the number 0 itself.

**Example 1:**

![](https://assets.leetcode.com/uploads/2020/10/02/addtwonumber1.jpg)

**Input:** l1 = [2,4,3], l2 = [5,6,4]

**Output:** [7,0,8]

**Explanation:** 342 + 465 = 807.

**Example 2:**

**Input:** l1 = [0], l2 = [0]

**Output:** [0]

**Example 3:**

**Input:** l1 = [9,9,9,9,9,9,9], l2 = [9,9,9,9]

**Output:** [8,9,9,9,0,0,0,1]

**Constraints:**

* The number of nodes in each linked list is in the range `[1, 100]`.
* `0 <= Node.val <= 9`
* It is guaranteed that the list represents a number that does not have leading zeros.
Original file line number Diff line number Diff line change
@@ -0,0 +1,36 @@
// #Medium #Top_100_Liked_Questions #Top_Interview_Questions #String #Hash_Table #Sliding_Window
// #Algorithm_I_Day_6_Sliding_Window #Level_2_Day_14_Sliding_Window/Two_Pointer #Udemy_Strings
// #Big_O_Time_O(n)_Space_O(1) #2024_10_20_Time_15_ms_(29.93%)_Space_9.7_MB_(47.88%)

#include <stdio.h>
#include <string.h>

int lengthOfLongestSubstring(const char* s) {
int lastIndices[256];
for (int i = 0; i < 256; i++) {
lastIndices[i] = -1;
}

int maxLen = 0;
int curLen = 0;
int start = 0;

for (int i = 0; i < strlen(s); i++) {
char cur = s[i];
if (lastIndices[(unsigned char)cur] < start) {
lastIndices[(unsigned char)cur] = i;
curLen++;
} else {
int lastIndex = lastIndices[(unsigned char)cur];
start = lastIndex + 1;
curLen = i - start + 1;
lastIndices[(unsigned char)cur] = i;
}

if (curLen > maxLen) {
maxLen = curLen;
}
}

return maxLen;
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,40 @@
3\. Longest Substring Without Repeating Characters

Medium

Given a string `s`, find the length of the **longest substring** without repeating characters.

**Example 1:**

**Input:** s = "abcabcbb"

**Output:** 3

**Explanation:** The answer is "abc", with the length of 3.

**Example 2:**

**Input:** s = "bbbbb"

**Output:** 1

**Explanation:** The answer is "b", with the length of 1.

**Example 3:**

**Input:** s = "pwwkew"

**Output:** 3

**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.

**Example 4:**

**Input:** s = ""

**Output:** 0

**Constraints:**

* <code>0 <= s.length <= 5 * 10<sup>4</sup></code>
* `s` consists of English letters, digits, symbols and spaces.
36 changes: 36 additions & 0 deletions src/main/c/g0001_0100/s0004_median_of_two_sorted_arrays/Solution.c
Original file line number Diff line number Diff line change
@@ -0,0 +1,36 @@
// #Hard #Top_100_Liked_Questions #Top_Interview_Questions #Array #Binary_Search #Divide_and_Conquer
// #Big_O_Time_O(log(min(N,M)))_Space_O(1) #2024_10_20_Time_0_ms_(100.00%)_Space_11.1_MB_(60.94%)

#include <stdio.h>
#include <limits.h>

double findMedianSortedArrays(int* nums1, int n1, int* nums2, int n2) {
if (n1 > n2) {
return findMedianSortedArrays(nums2, n2, nums1, n1);
}

int low = 0, high = n1;
while (low <= high) {
int cut1 = (low + high) / 2;
int cut2 = (n1 + n2 + 1) / 2 - cut1;

int l1 = (cut1 == 0) ? INT_MIN : nums1[cut1 - 1];
int l2 = (cut2 == 0) ? INT_MIN : nums2[cut2 - 1];
int r1 = (cut1 == n1) ? INT_MAX : nums1[cut1];
int r2 = (cut2 == n2) ? INT_MAX : nums2[cut2];

if (l1 <= r2 && l2 <= r1) {
if ((n1 + n2) % 2 == 0) {
return (double)(fmax(l1, l2) + fmin(r1, r2)) / 2.0;
} else {
return (double)fmax(l1, l2);
}
} else if (l1 > r2) {
high = cut1 - 1;
} else {
low = cut1 + 1;
}
}

return 0.0;
}
50 changes: 50 additions & 0 deletions src/main/c/g0001_0100/s0004_median_of_two_sorted_arrays/readme.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,50 @@
4\. Median of Two Sorted Arrays

Hard

Given two sorted arrays `nums1` and `nums2` of size `m` and `n` respectively, return **the median** of the two sorted arrays.

The overall run time complexity should be `O(log (m+n))`.

**Example 1:**

**Input:** nums1 = [1,3], nums2 = [2]

**Output:** 2.00000

**Explanation:** merged array = [1,2,3] and median is 2.

**Example 2:**

**Input:** nums1 = [1,2], nums2 = [3,4]

**Output:** 2.50000

**Explanation:** merged array = [1,2,3,4] and median is (2 + 3) / 2 = 2.5.

**Example 3:**

**Input:** nums1 = [0,0], nums2 = [0,0]

**Output:** 0.00000

**Example 4:**

**Input:** nums1 = [], nums2 = [1]

**Output:** 1.00000

**Example 5:**

**Input:** nums1 = [2], nums2 = []

**Output:** 2.00000

**Constraints:**

* `nums1.length == m`
* `nums2.length == n`
* `0 <= m <= 1000`
* `0 <= n <= 1000`
* `1 <= m + n <= 2000`
* <code>-10<sup>6</sup> <= nums1[i], nums2[i] <= 10<sup>6</sup></code>
Loading

0 comments on commit 1b65318

Please sign in to comment.