贪心:
跳跃游戏:
数组a[2,3,1,1,4],每个元素代表下一次最大可以走多少步。
1.问能否走到最后一个位置。
if(cnt==1){
return true;
} / /特判元素数量为一时肯定能走到;
for(i=0;i<=cover;i++){
cover=max(i+a[i],cover); / / 在当前元素能走到的最大位置与当前覆盖位置进行比较;
if(cover>=4){
return true;
}
}
return false;
2.问最少要走几步。
int result=0(记录步数),cur=0(记录当前最大范围),next=0(记录最大覆盖范围)
if(cnt==1){
return 0;
} / /特判元素数量为一时只需0步;
for(i=0;i<cnt;i++){
next=max(next,i+arr[i]);
if(i==cur){
if(cur!=cnt){
result++;
cur=next;
if(cur>=cnt)break;
}
else break;
}
printf("%d",result);
链表:
链表的删除元素:
一般操作:
struct ListNode* temp;//temp指针遍历所有链表元素
while(head && head->val == val) { //当链表有元素且需要删除链表头元素时
temp = head;
head = head->next;
free(temp); //释放空间
}
struct ListNode *cur = head; //cur指针从头指针元素开始遍历
while(cur && (temp = cur->next)) {
//当cur指针不为空时进行循环,且每次循环将temp指针初始化为cur->next.
if(temp->val == val) {
free(temp); //释放空间
}
else
cur = cur->next;
}
虚拟头节点:
ListNode *shead; //设置虚拟头节点方便进行代码的添加与删除操作
shead = (ListNode *)malloc(sizeof(ListNode));
shead->next = head;
ListNode *cur = shead;
while(cur->next != NULL){
if (cur->next->val == val){
ListNode *tmp = cur->next; // tmp指针指向所需删除的元素空间
cur->next = cur->next->next;
// 将cur指向的元素中的next重新指向cur下下个元素(cur下个元素即所需删除的元素)
free(tmp); // 释放需要删除的元素空间
}
else{
cur = cur->next; // cur指向下一个元素
}
}
head = shead->next; / / 头指针重新指向防止之前的循环删除了头元素的情况
free(shead); / / 释放虚拟指针