給定一個(gè)整數(shù)數(shù)組?nums和一個(gè)整數(shù)目標(biāo)值?target猜揪,請(qǐng)你在該數(shù)組中找出?和為目標(biāo)值?的那兩個(gè)整數(shù)坛梁,并返回它們的數(shù)組下標(biāo)而姐。
你可以假設(shè)每種輸入只會(huì)對(duì)應(yīng)一個(gè)答案划咐。但是拴念,數(shù)組中同一個(gè)元素不能使用兩遍褐缠。
你可以按任意順序返回答案政鼠。
python:
def two_sum(nums, target):
"""這樣寫更直觀队魏,遍歷列表同時(shí)查字典"""
????dct = {}
????for i, n in enumerate(nums):?
????????cp = target - n
????????if cp in dct:
????????????return[dct[cp], i]
????????else:?
?????????????dct[n] = i
def twoSum(nums, target):
????lens = len(nums)
????j=-1
????for i in range(1,lens):
????????temp = nums[:i]
????????if (target - nums[i]) in temp:
? ? ? ? ? ? j = temp.index(target - nums[i])
? ? ? ? ? ? break
????if j >= 0:
? ? ? ? return [j,i]
c:
int*twoSum(int* nums,intnumsSize,inttarget){
? ? int i,j;
? ? int *result=NULL;
????*returnSize=2;
? ? for(i=0;i<numsSize-1;i++)
? ? {
? ? ? ? for(j=i+1;j<numsSize;j++)
? ? ? ? {
? ? ? ? ? ? if(nums[i]+nums[j]==target)
? ? ? ? ? ? {
? ? ? ? ? ? ? ? result=(int*)malloc(sizeof(int)*2);
? ? ? ? ? ? ? ? result[0]=i;
? ? ? ? ? ? ? ? result[1]=j;
? ? ? ? ? ? ? ? return result;
? ? ? ? ? ? }
? ? ? ? }
? ? }
? ? return result;
}
注:malloc 是 c 語言中的動(dòng)態(tài)分配內(nèi)存,result=(int*)malloc(sizeof(int)*2)胡桨; malloc 函數(shù)返回的是?void\*?型,所以要強(qiáng)制類型轉(zhuǎn)換成?int昧谊,在前面加上?(int *)刽虹,才能給整型賦值呢诬,后面?(sizeof(int)*2)?的意思是分配兩個(gè)?int?大小的空間涌哲;
總結(jié):該方法簡單但是時(shí)間復(fù)雜度為?O(n^2^)馅巷√懦妫空間復(fù)雜度為?O(1)O(1);運(yùn)行速度慢且內(nèi)存空間消耗大
給你兩個(gè)非空?的鏈表钓猬,表示兩個(gè)非負(fù)的整數(shù)撩独。它們每位數(shù)字都是按照逆序的方式存儲(chǔ)的敞曹,并且每個(gè)節(jié)點(diǎn)只能存儲(chǔ)一位數(shù)字综膀。
請(qǐng)你將兩個(gè)數(shù)相加澳迫,并以相同形式返回一個(gè)表示和的鏈表剧劝。
你可以假設(shè)除了數(shù)字 0 之外橄登,這兩個(gè)數(shù)都不會(huì)以 0?開頭。
struct ListNode*addTwoNumbers(struct ListNode* l1, struct ListNode* l2)
{
????struct ListNode* p = l1;
????struct ListNode* q = l2;
????int len1=1;//單鏈表l1的長度
????int len2=1;//單鏈表l2的長度
????while(p->next != NULL){//遍歷單鏈表
? ? ? ? len1++;
? ? ? ? p=p->next;
? ? }
? ? while(q->next != NULL){
? ? ? ? len2++;
? ? ? ? q=q->next;
? ? }
//將短的單鏈表用0補(bǔ)全
????if(len1<len2){
? ? ? ? int len = len2 - len1;
? ? ? ? while(len --){
? ? ? ? ? ? structListNode* r = (structListNode*)malloc(sizeof(structListNode));
????????????r->val = 0;
? ? ? ? ? ? r->next = NULL;
? ? ? ? ? ? p -> next = r;
? ? ? ? ? ? p = p -> next;
? ? ? ? }
? ? }
? ? if(len1 >len2){
? ? ? ? int len = len1-len2;
? ? ? ? while(len --){
? ? ? ? ? ? structListNode* r = (structListNode*)malloc(sizeof(structListNode));
????????????r->val=0;
? ? ? ? ? ? r->next=NULL;
? ? ? ? ? ? q->next=r;
? ? ? ? ? ? q=q->next;
? ? ? ? }
? ? }
? ? int MaxLen=0;
? ? if(len1<=len2)
? ? MaxLen=len2;
? ? else{
? ? ? ? MaxLen=len1;
? ? }
//設(shè)置進(jìn)位sign谣妻,計(jì)算l1和l2現(xiàn)有結(jié)點(diǎn)和值并保存在l1中
????int sum = 0;
? ? int sign = 0;
? ? p = l1;
? ? q = l2;
? ? while(MaxLen --){
? ? ? ? sum = p->val + q->val + sign;
? ? ? ? if(sum > 9){
? ? ? ? ? ? sign = 1;
? ? ? ? }
? ? ? ? else{
? ? ? ? ? ? sign = 0;
? ? ? ? }
? ? ? ? p->val = sum % 10;
? ? ? ? if(p->next != NULL && q->next != NULL){
? ? ? ? p = p->next;
? ? ? ? q = q->next;
? ? ? ? }
? ? }//如果l1和l2最后結(jié)點(diǎn)值相加大于9,新建一個(gè)結(jié)點(diǎn)加到單鏈表尾蹋半,并將其val賦值為1? ??
? ? if(sign == 1){
? ? ? ? structListNode* m = (structListNode*)malloc(sizeof(structListNode));
????????m->val = 1;
? ? ? ? m->next = NULL;
? ? ? ? p->next = m;
? ? ? ? return l1;
? ? ? ? }
? ? ? ? return l1;
? }