135.分發糖果:
//根據規則只需要滿足每個人至少有乙個糖果,且前乙個的評分如果比後乙個高就需要它的糖果更多;但是只有一遍的話會出現bug,因為每次對比可能會使自身糖果數發生改變從而導致前乙個的糖果數不準確,此時我們需要從後往前再來一遍再進行一次遍歷修正。
intcandy
(int
* ratings,
int ratingssize)
for(i=
0;i1;i++)}
if(ratings[i]
)}}for
(i=ratingssize-
1;i>
0;i--)}
if(ratings[i]
)}cnt +
= a[i];}
if(ratingssize>0)
return cnt;
}
85.最大矩形:
int
maximalrectangle
(char
** matrix,
int matrixsize,
int* matrixcolsize)
int n = matrixcolsize[0]
;//列
int ll[m]
[n];
//儲存原陣列每個元素左邊有多少1的陣列
memset
(ll,0,
sizeof
(ll));
//清空
int i,j;
for(i=
0;i}//初始寬已經定義完了
int ret =0;
for(i=
0;i)int width = ll[i]
[j];
//寬,向左的距離
int area = width;
//先和寬相同,高為1
int k;
for(k=i-
1;k>=
0;k--
) ret =
fmax
(ret,area)
;//計算所有可能的最大面積}}
return ret;
}
330.按要求補齊陣列:
/*可以這麼理解,以[1,5,10]的例子為例: 我們從1開始遍歷,並且維護乙個指向nums的下標.一開始是1,而我們看到當前nums陣列的第乙個元素就是1,所以不需要其他操作.直接跳到2,並且讓pos指向nums的第二個元素;
現在,我們的目標數是2,但是當前pos指向的數卻是5,顯然我們只能自己填充乙個2,所以讓res+1;既然我們已經填過2了,而在2之前可以被覆蓋的最長區間長度是1,所以當前可以遍歷到的最大區間長度變成了3(即2 + 1);
然後,我們可以忽略3,直接跳到4(因為上一步已經知道3在最大覆蓋範圍內了)。我們發現4同樣比當前pos所指向的nums元素小,所以我們得填入4,即讓res+1;既然已經填入4了,而我們知道在4之前可以覆蓋的連續區間是(1-3),所以當前可以覆蓋的最大區間被擴充套件到了7(即4 + 3)。
接下來我們可以直接跳過5、6、7來到8,而當前pos所指向的元素是5,所以當前可覆蓋的區間大小又可以加上5了(7+5 = 12),並讓pos指向下乙個元素
最後我們跳過了7-12,從13開始遍歷,這時候pos所指的元素是10,所以覆蓋範圍變成了12 + 10 = 22 >20,說明可以完全覆蓋指定區間了!
到這裡大概能夠看出端倪 :我們不斷維持乙個從1開始的可以被完全覆蓋的區間,舉個例子,當前可以完全覆蓋區間是[1,k],而當前pos所指向的nums中的元素為b,說明在b之前(因為是公升序,所以都比b小)的所有元素之和可以對映到1-----k,而當我們把b也加入進去後,顯然,可對映範圍一定向右擴充套件了b個,也就是變成了1---k+b,這就是解題的思路*/
intminpatches
(int
* nums,
int numssize,
int n)
else
i = ret;
}return cnt;
}
1046.最後一塊石頭的重量:
//用了雜湊表來裝這些資料
intlaststoneweight
(int
* stones,
int stonessize)
;int i,j;
int min=
1100
,max=0;
for(i=
0;i(min > stones[i])}
//為了少遍歷一些
for(i = max;i >= min;i--
)while
(book[i]
>=2)
if(book[i]==1
&& i > min)
if(i-j < min)
book[i]=0
;//減掉此時的數
book[j]-=
1;//減少乙個前面的數
book[i-j]++;
//增加乙個新數}}
return i+1;
}
435.無重疊區間:
voidqs(
int a[
2],int low,
int high)
//快排
int key1=a[low][0
];int key2=a[low][1
];while
(lowfor(
;low= a[low][0
];low++);
if(key1])
} a[low][0
]=key1;
a[low][1
]=key2;
qs(a,i,low-1)
;qs(a,low+
1,j);}
intmin
(int x,
int y)
else
}int
eraseoverlapintervals
(int
** intervals,
int intervalssize,
int* intervalscolsize)
int i,j;
int a[intervalssize][2
]=intervals;
qs(a,
0,intervalssize-1)
;//按照左邊界進行排序
int cnt=0;
j = a[0]
[1];
//初始化判斷點為第乙個點的右邊界
for(i=
1;i)else
}return cnt;
}
86.分割鍊錶:
/**
* definition for singly-linked list.
* struct listnode ;
*///大的放一起,小的放一起,然後分別進行遍歷
struct listnode*
partition
(struct listnode* head,
int x)
else
p = p->next;
} p = head;
q_min = head_min->next;
q_max = head_max->next;
while
(q_min)
while
(q_max)
return head;
}
以上是最近力扣每日一題的部分總結。
基本演算法總結,力扣題目整理
系統性學習演算法,紮實您的打碼基本功!作為演算法初學者的我從19年8月份開始在力扣學習演算法,到現在ac了700多道題目。隨著打卡題目數量的增多,我發現演算法常見考察的知識點大概有十幾種,包括 二分,滑動視窗,雙指標,單調棧 單調佇列 鍊錶,二叉樹,字串處理,dfs 回溯,並查集,動態規劃,貪心,位...
力扣總結 環形鍊錶相關題目
1.160.相交鍊錶 編寫乙個程式,找到兩個單鏈表相交的起始節點。如下面的兩個鍊錶 在節點 c1 開始相交。示例 1 輸入 intersectval 8,lista 4,1,8,4,5 listb 5,0,1,8,4,5 skipa 2,skipb 3 輸出 reference of the nod...
力扣題目 實現 strStr
題目 給定乙個 haystack 字串和乙個 needle 字串,在 haystack 字串中找出 needle 字串出現的第乙個位置 從0開始 如果不存在,則返回 1。解題思路 1.對各種極端的情況進行處理 比如,原字串長度比要尋找的字串短,空字串,以及兩個字串本來就相同 2.對一般的字串的操作 ...