leetcode训练(C语言) 016~020

16. 最接近的三数之和

int comp(const void* a, const void* b)
{
    return *(int*)a - *(int*)b;
}

int threeSumClosest(int* nums, int numsSize, int target)
{
    qsort(nums, numsSize, sizeof(int), comp);
    int sum = INT_MAX;
    int result = 0;
    for(int i = 0; i < numsSize - 2; i++) {
        int left = i + 1;
        int right = numsSize - 1;
        while(left < right) {
            result = nums[i] + nums[left] + nums[right] - target;
            if(result < 0) {
                left++;
            }
            else if(result == 0) {
                return target;
            }
            else {
                right--;
            }
            if(abs(result) < abs(sum)) {
                sum = result;
            }
        }
    }
    return  target + sum;
}

 

17. 电话号码的字母组合

/**
 * Note: The returned array must be malloced, assume caller calls free().
 */
char ** letterCombinations(char * digits, int* returnSize)
{
    if(digits[0] == '\0') {
        *returnSize = 0; 
        return NULL;
    }
    char *dic[]= {"abc", "def", "ghi", "jkl", "mno", "pqrs", "tuv", "wxyz"};
    int i, j, k;
    int len = strlen(digits);
    int size = 1;
    for(i = 0; digits[i] != '\0'; ++i) {
        size *= strlen(dic[digits[i] - 50]);
    }
    *returnSize = size;
    char** ans = (char**)malloc(size * sizeof(char*));
    for(i = 0; i < size; ++i) {
        ans[i] = (char *)malloc((len + 1) * sizeof(char));
    }
    int t = size, m, l;
    for(i = 0; i < len; ++i) {
        l = strlen(dic[digits[i] - 50]);
        t /= l;
        for(j = 0; j < l; ++j) {
            for(m = 0; m < size / t / l; ++m) {
                for(k = 0; k < t; ++k) {
                    ans[m * l * t + j * t + k][i] = dic[digits[i] - 50][j];
                }
            }     
        }
    }
    for(i = 0; i < size; ++i) {
        ans[i][len] = '\0';
    } 
    return ans;
}

 

18. 四数之和

/**
 * Return an array of arrays of size *returnSize.
 * The sizes of the arrays are returned as *returnColumnSizes array.
 * Note: Both returned array and *columnSizes array must be malloced, assume caller calls free().
 */
 int compare(const void* a, const void* b) 
 {
    return (*(int*)a)-(*(int*)b);
}

int** fourSum(int* nums, int numsSize, int target, int* returnSize, int** returnColumnSizes)
{
    int** returnArray = (int**)malloc(sizeof(int*) * 250);
    int ptr_ra = -1;
    *returnColumnSizes = (int *)malloc(sizeof(int) * 250);
    int i, j, k, t;
    int newTarget1, newTarget2;
    qsort(nums, numsSize, sizeof(int), compare);
    for (i = 0; i < numsSize - 3; i++) {
        if (i == 0 || ((i > 0) && (nums[i] != nums[i - 1]))) {
            newTarget1 = target - nums[i];
            for (j = i + 1; j < numsSize - 2; j++) {
                if (j == i + 1 || ((j > i + 1) && (nums[j] != nums[j - 1]))) {
                    k = j + 1;
                    newTarget2 = newTarget1 - nums[j];
                    t = numsSize - 1;
                    while (k < t) {
                        if (nums[k] + nums[t] == newTarget2) {
                            returnArray[++ptr_ra] = (int *)malloc(sizeof(int) * 4);
                            returnArray[ptr_ra][0] = nums[i];
                            returnArray[ptr_ra][1] = nums[j];
                            returnArray[ptr_ra][2] = nums[k];
                            returnArray[ptr_ra][3] = nums[t];
                            (*returnColumnSizes)[ptr_ra] = 4;
                            while (k < t && nums[k] == nums[k + 1]) k++;
                            while (k < t && nums[t] == nums[t - 1]) t--;
                            k++;
                            t--;
                        }
                        else if (nums[k] + nums[t] > newTarget2) {
                            while (k < t && nums[t] == nums[t - 1]) {
                                t--;
                            }
                            t--;
                        }
                        else {
                            while (k < t && nums[k] == nums[k + 1]) {
                                k++;
                            }
                            k++;
                        }
                    } 
               }
            }
        }
    }
    *returnSize = ptr_ra + 1;
    return returnArray;
}

 

19. 删除链表的倒数第N个节点

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     struct ListNode *next;
 * };
 */

struct ListNode* removeNthFromEnd(struct ListNode* head, int n)
{
    typedef struct ListNode list;
    list *p1 = head;
    int size = 0;
    while(p1 != NULL) {
        size++;
        p1 = p1->next;
    }
    if(size == 1) {   
        return NULL;
    }
    size = size - n;
    if(size == 0) {
        return head->next;
    }
    p1 = head;
    for(int i = 0; i < size - 1; i++) {
        p1 = p1->next;
    }
    p1->next = p1->next->next;
    return head;
}

 

20. 有效的括号

bool isValid(char * s) 
{
    char a[10240];
    int i = 0;
    int j = -1;
    while (s[i] != '\0') {
        if (s[i] == '(') {
            a[++j] = '(';
        }
        else if (s[i] == '[') {
            a[++j] = '[';
        }
        else if (s[i] == '{') {
            a[++j] = '{';
        }
        else if (s[i] == ')') {
            if (j == -1 || a[j] != '(') {
                return false;
            }
            else {
                j--;
            }
        }
        else if (s[i] == ']') {
            if (j == -1 || a[j] != '[') {
                return false;
            }
            else {
                j--;
            }
        }
        else if (s[i] == '}') {
            if (j == -1 || a[j] != '{') {
                return false;
            }
            else {
                j--;
            }
        }
        i++;
    }
    if (j == -1) {
        return true;
    }
    else {
        return false;
    }
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值