A
A
4Sum
#include <stdio.h>
#include <stdlib.h>
// Function prototypes
int** fourSum(int* nums, int numsSize, int target, int* returnSize, int** returnColumnSizes);
void printResult(int** result, int returnSize, int* returnColumnSizes);
int** fourSum(int* nums, int numsSize, int target, int* returnSize, int** returnColumnSizes) {
*returnSize = 0;
if (numsSize < 4) return NULL;
int left = j + 1;
int right = numsSize - 1;
if (sum == target) {
result[*returnSize] = malloc(4 * sizeof(int));
result[*returnSize][0] = nums[i];
result[*returnSize][1] = nums[j];
result[*returnSize][2] = nums[left];
result[*returnSize][3] = nums[right];
(*returnColumnSizes)[*returnSize] = 4;
(*returnSize)++;
return result;
}
// Helper function for testing
void testFourSum() {
int nums[] = {1, 0, -1, 0, -2, 2};
int target = 0;
int numsSize = sizeof(nums) / sizeof(nums[0]);
int returnSize;
int* returnColumnSizes;
if (a_ok) {
if (A[i] != A[0]) a_up ++; // flip up to make all are A[0] on top
else if (B[i] != A[0]) a_down ++; // flip down to make all are A[0] in bottom
}
if (b_ok) {
if (B[i] != B[0]) b_down ++;
else if (A[i] != B[0]) b_up ++;
}
}
return -1;
}
1004.Maximum depth of Binary Tree
int maxDepth(struct TreeNode* root) {
if (!root) return 0; // Check if the root is NULL
int l = maxDepth(root->left) + 1; // Depth of the left subtree
int r = maxDepth(root->right) + 1; // Depth of the right subtree
return l > r ? l : r; // Return the larger depth
}
return node;
}
struct TreeNode* buildTree(int* preorder, int preorderSize, int* inorder, int inorderSize) {
data_t data;
data.preorder = preorder;
data.pre_idx = 0;
data.pre_sz = preorderSize;
data.inorder = inorder;
i = start;
while (i < end && data->inorder[i] != node->val) i++;
return node;
}
struct TreeNode* buildTree(int* inorder, int inorderSize, int* postorder, int postorderSize) {
data_t data;
data.postorder = postorder;
data.post_idx = postorderSize;
data.inorder = inorder;
return node;
}
left = node->left;
right = node->right;
node->left = node->right = NULL;
prev->right = node;
prev = node;
prev = preOrderTraversal(prev, left); // it's important to update prev
prev = preOrderTraversal(prev, right);
return prev;
}
120.Triangle
#include <stdio.h>
#include <stdlib.h>
// O(n)
int cost = prices[0];
for (i = 1; i < pricesSize; i ++) {
if (prices[i] > cost) {
d = prices[i] - cost;
k = d > k ? d : k;
} else {
cost = prices[i];
}
}
return k;
}
p = 0;
for (i = 1; i < pricesSize; i ++) {
d = prices[i] - prices[i - 1];
p = d > 0 ? p + d : p; // get it as long as it is a profit!
}
return p;
}
return sell2;
}
if (!node) return 0;
l = maxsum(node->left, max);
r = maxsum(node->right, max);
125.Valid Palindrome
#include <stdbool.h>
#include <string.h>
bool isPalindrome(char* s) {
int i = 0;
int j;
char a, b;
j = strlen(s) - 1;
while (i < j) {
a = s[i];
b = s[j];
if (a != b) {
return false; // Not a palindrome
}
i++;
j--;
}
return true; // Is a palindrome
}
127.Word ladder
typedef struct {
char **q;
int n;
} q_t;
int one_diff(char *a, char *b) {
int diff = 0;
while (*a && diff <= 1) {
diff += (*a != *b) ? 1 : 0;
a ++; b ++;
}
return diff == 1 ? 1 : 0;
}
int bfs(q_t *q1, q_t *q2, char *end, char **dict, int sz, int *v) {
int i, d;
char *a, *b;
q_t *tmp;
d = 1;
while (q1->n) {
while (q1->n) {
a = q1->q[-- q1->n];
for (i = 0; i < sz; i ++) {
if (v[i]) continue;
b = dict[i];
if (one_diff(a, b)) {
if (!strcmp(b, end)) { // done!
return d;
}
v[i] = 1;
q2->q[q2->n ++] = b;
}
}
}
tmp = q1; // switch queues
q1 = q2;
q2 = tmp;
d ++;
}
return -1;
}
int ladderLength(char* beginWord, char* endWord, char** wordList, int wordListSize) {
int *visited, i, n = 0;
q_t q1 = { 0 }, q2 = { 0 };
free(visited);
free(q1.q);
return n + 1;
}
132.Palindrome Partioning II
int _min(int a, int b) {
return a < b ? a : b;
}
int minCut(char* s) {
int *dp, n, i, k;
n = strlen(s);
dp[0] = -1;
for (i = 0; i < n; i ++) {
dp[i + 1] = dp[i] + 1;
}
for (k = 1; // "aba"
i - k >= 0 &&
i + k < n &&
s[i - k] == s[i + k];
k ++) {
dp[i + k + 1] = _min(dp[i + k + 1], dp[i - k] + 1);
}
for (k = 1; // "aaaa"
i - k + 1 >= 0 &&
i + k < n &&
s[i - k + 1] == s[i + k];
k ++) {
dp[i + k + 1] = _min(dp[i + k + 1], dp[i - k + 1] + 1);
}
}
i = dp[n];
free(dp);
return i;
}
135.Candy
int candy(int* ratings, int ratingsSize) {
int *candies;
int i, x;
candies[0] = 1;
for (i = 1; i < ratingsSize; i ++) {
if (ratings[i] > ratings[i - 1]) {
candies[i] = candies[i - 1] + 1;
} else {
candies[i] = 1;
}
}
x = candies[ratingsSize - 1];
return x;
}
136.Single Number
int singleNumber(int* nums, int numsSize) {
int i, k = 0;
for (i = 0; i < numsSize; i++) {
k = k ^ nums[i]; // a ^ a equals to 0; 0 ^ a equals to a
}
return k;
}
137.Single Number I
int singleNumber(int* nums, int numsSize) {
int i, ones, twos;
ones = twos = 0;
for (i = 0; i < numsSize; i++) {
ones = (ones ^ nums[i]) & ~twos;
twos = (twos ^ nums[i]) & ~ones;
}
return ones;
}
139.Word Break
bool search(char *s, int l, char **wordDict, int wordDictSize) {
int i;
char *word;
for (i = 0; i < wordDictSize; i ++) {
word = wordDict[i];
if (word && l == strlen(word) && !strncmp(s, word, l)) return true;
}
return false;
}
bool wordBreak(char* s, char** wordDict, int wordDictSize) {
int i, j, l;
bool *buff, *e, result;
l = strlen(s);
buff[0] = true;
e = &buff[1];
return result;
}
140.Word Break II
#include <stdlib.h>
#include <string.h>
typedef struct {
char **p;
int sz;
int n;
} res_t;
typedef struct {
char *b;
int sz;
int n;
} buff_t;
int *newvec() {
int *vec = malloc(12 * sizeof(int));
// assert(vec);
vec[0] = 12;
vec[1] = 0;
return vec;
}
if (start == end) {
buff->b[--buff->n] = 0;
add2res(res, strdup(buff->b));
return;
}
n = buff->n;
vec = dp[start];
for (i = 0; i < vec[1]; i++) {
k = vec[2 + i];
add2buff(buff, n, &s[start], k - start);
bt(res, buff, s, dp, k, end);
}
}
res.sz = 10;
res.n = 0;
res.p = malloc(res.sz * sizeof(char *));
// assert(res.p);
buff.sz = 100;
buff.n = 0;
buff.b = malloc(buff.sz * sizeof(char));
// assert(buff.b);
dp[0] = newvec();
for (i = 0; i < len; i++) {
if (dp[i]) { // a valid point to cut
for (j = 0; j < wordDictSize; j++) {
if (!strncmp(&s[i], wordDict[j], wsz[j])) {
k = i + wsz[j];
add2vec(dp[i], k);
if (!dp[k]) dp[k] = newvec();
}
}
}
}
if (dp[len]) {
bt(&res, &buff, s, dp, 0, len);
}
free(wsz);
for (i = 1; i <= len; i++) {
if (dp[i]) free(dp[i]);
}
free(dp);
free(buff.b);
*returnSize = res.n;
return res.p;
}
148.Sort List
struct ListNode* divide(struct ListNode *p) {
struct ListNode *a, *b;
a = p;
b = p->next;
while (b) {
b = b->next; // b moves two steps
if (b) {
a = a->next; // a moves one steps
b = b->next;
}
}
b = a->next; // this is the middle point
a->next = NULL;
return b;
}
p = &head;
while (a && b) {
if (a->val < b->val) {
c = a;
a = a->next;
} else {
c = b;
b = b->next;
}
p->next = c;
p = c;
}
p->next = a ? a : b;
return head.next;
}
struct ListNode* sortList(struct ListNode* head) {
struct ListNode *p, *a, *b;
return p;
}
return i - 1;
#else
int l, r, m;
if (numsSize == 1) return 0;
l = 0;
r = numsSize - 1;
while (l < r) {
m = l + (r - l) / 2;
if (nums[m] < nums[m + 1]) {
l = m + 1;
} else {
r = m;
}
}
return l;
#endif
}
if (version2) {
v2 = version2;
version2 = strchr(version2, '.');
if (version2) {
*version2 = 0; // Terminate the string at the dot
version2++; // Move to the next character after the dot
}
b = atoi(v2);
} else {
b = 0;
}
if (a > b) return 1;
if (a < b) return -1;
}
return 0;
}
k = num / den;
f = num % den;
p[n++] = '.';
dec = malloc(dsz * sizeof(int));
//assert(dec);
repeat_at = -1;
if (f < 0) f = -f;
while (f) {
for (i = 0; i < x; i += 2) {
if (dec[i] == f) {
repeat_at = i;
goto done;
}
}
if (x + 1 >= dsz) {
dsz *= 2;
dec = realloc(dec, dsz * sizeof(int));
//assert(dec);
}
dec[x++] = f;
f *= 10;
k = f / den;
dec[x++] = k;
f = f % den;
}
done:
for (i = 0; i < x; i += 2) {
if (n + 3 > psz) {
psz *= 2;
p = realloc(p, psz * sizeof(char));
//assert(p);
}
if (repeat_at == i) {
p[n++] = '(';
}
p[n++] = '0' + dec[i + 1];
}
if (repeat_at != -1) p[n++] = ')';
p[n++] = 0;
free(dec);
return p;
}
*returnSize = 0;
i = 0;
j = numbersSize - 1;
while (i < j) {
total = numbers[i] + numbers[j];
if (total > target) {
j--;
} else if (total < target) {
i++;
} else {
result[0] = i + 1; // Store the first index (1-based)
result[1] = j + 1; // Store the second index (1-based)
*returnSize = 2; // Indicate that we found a result
break;
}
}