栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

leetCode刷题

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

leetCode刷题

两数之和
法1:暴力枚举

int* twoSum(int* nums, int numsSize, int target, int* returnSize){
    int flag = 0;
    for(int i=0; i
        for(int j=i+; j
            if(nums[i]+nums[j] == target){
                int *res = (int*)malloc(sizeof(int)*2);
                res[0] = i;
                res[1] = j;
                *returnSize = 2;
                return res;
            }
        }
    }
    *returnSize = 0;
    return NULL;
}

法2:利用hash表

typedef struct _hashTable{
    int key;
    int value;
    UT_hash_handle hh;
}HashTable;

HashTable *hashtable;

HashTable *find(int ikey){
    HashTable *temp = NULL;
    HASH_FIND_INT(hashtable, &ikey, temp);
    return temp;
}

void add(int ikey, int ivalue){
    HashTable *h = find(ikey);
    if(h == NULL){//没找到则添加到表中
        HashTable *temp = (HashTable*)malloc(sizeof(HashTable));
        temp->key = ikey;
        temp->value = ivalue;
        HASH_ADD_INT(hashtable, key, temp);
    }
    //else
    //   h->value = ivalue;//否则修改原结构
}
int* twoSum(int* nums, int numsSize, int target, int* returnSize){
    hashtable = NULL;
    for(int i=0; i
        HashTable *temp = find(target - nums[i]);
        if(temp != NULL){
            int* res = (int*)malloc(sizeof(int)*2);
            res[0] = temp->value;
            res[1] = i;
            *returnSize = 2;
            return res; 
        }
        add(nums[i], i);
    }
    *returnSize = 0;
    return NULL;
}

关于uthash.h 参考名叫:嵌入式与Linux那些事的一位博主写的文章C语言哈希表uthash的使用方法详解

两数相加

typedef struct _ListNode{
    int val;
    struct _ListNode *next;
}ListNode;

void insert(ListNode *loc, int value){
    ListNode *node = (ListNode*)malloc(sizeof(ListNode));
    node->next = loc->next;
    node->val = value;
    loc->next = node;
}

struct ListNode* addTwoNumbers(ListNode* l1, ListNode* l2){
    int sum = 0, carry = 0, a, b;
    ListNode *pL1 = l1, *pL2 = l2, *rear;
    ListNode *pRes = (ListNode*)malloc(sizeof(ListNode));
    rear = pRes;
    pRes->next = NULL;

    while(pL1 != NULL || pL2 != NULL){
        a = pL1 == NULL ? 0 : pL1->val;
        b = pL2 == NULL ? 0 : pL2->val;
        sum = a+b+carry >= 10 ? a+b+carry-10 : a+b+carry;
        carry = a+b+carry >= 10 ? 1 : 0;
        insert(rear,sum);
        rear = rear->next;
        pL1 = pL1 == NULL ? pL1 : pL1->next;
        pL2 = pL2 == NULL ? pL2 : pL2->next;
        
    }
    if(carry != 0)
        insert(rear, 1);
    pRes = pRes->next;
    return pRes;
}

无重复字符的最长子串

int lengthOfLongestSubstring(char *s) {
    int low, high, length;
    low = high = length = 0;

    while(s[high] != ''){
        for(int i=low; i
            if(s[i] == s[high]){
                low = i+1;
                break;
            }
        }
        length = high - low + 1 > length ? high - low + 1 : length;
        high++;
    }
	return length;
}

最长回文子串

  1. 中心扩散法
int PalindromeSize(char *s, int low, int high, int len){
    while(low>=0 && high
        low--;
        high++;
    }
    return high - low -1;
}
char *longestPalindrome(char *s) {
    int s_len, maxLen, begin; 
    s_len = maxLen = begin = 0;
    while(*(s+s_len))
        s_len++;
    if(s_len < 2)
        return s;
    for(int i=0; i
        int oddLen = PalindromeSize(s, i, i, s_len);//长度为奇数的回文串形如xax
        int evenLen = PalindromeSize(s, i, i+1, s_len);//长度为偶数的回文串形如xx

        int tempLen = oddLen > evenLen ? oddLen : evenLen;
        if(tempLen > maxLen){
            maxLen = tempLen;
            begin = maxLen%2 == 0 ? i - maxLen/2+1: i - maxLen/2;
        }
    }
    *(s+begin+maxLen) = '';
    return s+begin;
}
2. 动态规划
		dp[i][j] 表示字符串s[i...j]是否为回文串,若s[i] != s[j] , 则dp[i][jj] = 0; 若s[i] == s[j], 则dp[i][j] = dp[i+1][j-1]; 
		若字符串长度小于3 形如xx类型,则dp[i][j] = 1;
char * longestPalindrome(char * s){
    int s_len, maxLen, begin;
    s_len = strlen(s);
    maxLen = begin = 0;

    if(s_len < 2)
        return s;
    int dp[1000][1000] = {0};
    for(int i=0; i
        int l;
        for(l=0; l<=r; l++){
            if(s[l] != s[r])
                dp[l][r] = 0;
            else{
                if(r-l < 3)
                    dp[l][r] = 1;
                else
                    dp[l][r] = dp[l+1][r-1];
            }
            if(dp[l][r] && r-l+1 > maxLen){
            begin = l;
            maxLen = r-l+1;
        }
        }
    }
    *(s+begin+maxLen) = '';
    return s+begin;
}
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/961072.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号