【力扣】刷算笔记 [C语言描述]
刷算笔记 [C语言描述]
1. [力扣24] 两两交换链表中的节点🍧
题目描述
给定一个链表,两两交换其中相邻的节点,并返回交换后的链表。(题目指定要利用栈)
假如输入
输入:head = [1,2,3,4]
应当输出
输出:[2,1,4,3]
LinkList Swappair(LinkList L)
{
if(L->next==NULL)
return L;
InitStack(S);
LNode p = (LinkList*)malloc(sizeof(LNode));
P->next = NULL;
LNode cur = L->next;
L->next = p;
while(cur!=NULL && cur->next!=NULL){
Push(S,cur);
Push(S,cur->next);
cur = cur->next->next;
Pop(S,p->next);
p=p->next;
Pop(S,p->next);
P=p->next;
}
if(cur!=NULL)
p->next = cur;
else
p->next = NULL;
return L;
}
2. [力扣33] 搜索旋转排序数组🍧
题目描述
给你一个整数数组 nums ,和一个整数 target 。
该整数数组原本是按升序排列,但输入时在预先未知的某个点上进行了旋转。(例如,数组 [0,1,2,4,5,6,7] 可能变为 [4,5,6,7,0,1,2] )。
请你在数组中搜索 target ,如果数组中存在这个目标值,则返回它的索引,否则返回 -1 。
假如输入
示例1——输入:nums = [4,5,6,7,0,1,2], target = 0
示例2——输入:nums = [4,5,6,7,0,1,2], target = 3
应当输出
示例1——输出:4
示例2——输出:-1
int search(int a[],int n,int x){
int left=0,right=n-1;
while(left<=right){
int mid = left+(right-left)/2;
if(a[mid] ==x)
return mid;
if(a[left]==x)
return left;
if(a[right]==x)
return right;
if(a[mid]>=a[left]){
if(a[mid]>=x && a[left]<=x)
right = mid-1;
else
left = mid+1;
}
if(a[mid]<=a[right])
{
if(a[mid]<=x && a[right]>=x)
left = mid+1;
else
right = mid-1;
}
}
return -1;
}
3. [力扣199] 二叉树的右视图🍧
题目描述
给定一棵二叉树,想象自己站在它的右侧,按照从顶部到底部的顺序,返回从右侧所能看到的节点值。
假如输入
输入: [1,2,3,null,5,null,4]
应当输出
输出: [1, 3, 4]
解释:
1 <---
/ \
2 3 <---
\ \
5 4 <---
int* RightSideView(BiTree T)
{
int *ressize = 0;
int *res = (int*)malloc(sizeof(int)*1000);
travel(T,1,ressize,res);
return res;
}
void travel(BiTree T,int depth,int *ressize,int *res){
if(T==NULL)
return;
if(depth> *ressize){
res[*ressize] = T->data;
*ressize = depth;
}
depth+=1;
travel(T->lchild,depth,ressize,res);
travel(T->rchild,depth,ressize,res);
}
4. [力扣199] 二叉树的坡度🍧
题目描述
给定一个二叉树,计算 整个树 的坡度 。
一个树的 节点的坡度 定义即为,该节点左子树的节点之和和右子树节点之和的 差的绝对值 。如果没有左子树的话,左子树的节点之和为 0 ;没有右子树的话也是一样。空结点的坡度是 0 。
整个树 的坡度就是其所有节点的坡度之和。
假如输入
输入:root = [1,2,3]
应当输出
输出:1
解释:
节点 2 的坡度:|0-0| = 0(没有子节点)
节点 3 的坡度:|0-0| = 0(没有子节点)
节点 1 的坡度:|2-3| = 1(左子树就是左子节点,所以和是 2 ;右子树就是右子节点,所以和是 3 )
坡度总和:0 + 0 + 1 = 1
int findTilt(BiTree T){
int tilt =0;
travel(T,&tilt);
return tilt;
}
travel(BiTree T,int *tilt){
if(T==NULL)
return 0;
else{
int right,left;
right = trael(T->rchild,tilt);
left = travel(T->lchild.tilt);
*tilt += abs(left-right);
return T->data + right+left;
}
}
1. [力扣1143] 最长公共子序列🍧
题目描述
给定两个字符串 text1 和 text2,返回这两个字符串的最长公共子序列的长度。
一个字符串的 子序列 是指这样一个新的字符串:它是由原字符串在不改变字符的相对顺序的情况下删除某些字符(也可以不删除任何字符)后组成的新字符串。
例如,"ace" 是 "abcde" 的子序列,但 "aec" 不是 "abcde" 的子序列。两个字符串的「公共子序列」是这两个字符串所共同拥有的子序列。
若这两个字符串没有公共子序列,则返回 0。
假如输入
示例1——输入:text1 = "abcde", text2 = "ace"
示例2——输入:text1 = "abc", text2 = "abc"
应当输出
示例1——输出:3
示例2——输出:3
//解释:最长公共子序列是 "ace",它的长度为 3。
//解释:最长公共子序列是 "abc",它的长度为 3。
/*
解题思路:
1.dp数组记录两个字符串公共子序列的长度
2.若text1[i-1]==text2[j-1],dp数组返回左上角数+1: dp[i][j]=dp[i-1][j-1]+1;
3.否则 返回左边和上边的最大值: dp[i][j]=max(dp[i-1][j],dp[i][j-1])
*/
int longestCommonSubsequence(char * str1, char * str2){
if(!str1 || !str2)
return 0;
int dp[1001][1001]={0};
int i,j;
int len1 = strlen(str1),len2 = strlen(str2);
for(i=1;i<=len1;i++)
for(j<=0;j<=len2;j++){
if(str1[i-1]==str2[j-1])
dp[i][j] = dp[i-1][j-1]+1;
else
dp[i][j] = max(dp[i-1][j],dp[i][j-1]);
}
return dp[len1][len2];
}
蟠桃记
题目描述:
第一天悟空吃掉桃子总数一半多一个,第二天又将剩下的桃子吃掉一半多一个,以后每天吃掉前一天剩下的一半多一个,到第n天准备吃的时候只剩下一个桃子。聪明的你,请帮悟空算一下,他第一天开始吃的时候桃子一共有多少个呢?
输入描述:
/*
输入数据有多组,每组占一行,包含一个正整数n(1<n〈30),表示只剩下一个桃子的时候是在第n天发生的。
*/
1
4
输出描述:
/*
对于每组输入数据,输出第一天开始吃的时似桃子的总数,每个测试实例占一行。
*/
4
代码如下:
# include<stdio.h>
int main(){
int i=e;
int dp[31]={0};
dp[1]=1;
for(i=2;i<30;i++){
dp[i]=(dp[i-1]+1)*2;
while(scanf("%d",&n)!=EOF){
printf("%d\n", dp[n]);
}
return 0;
}