【力扣】刷算笔记 [C语言描述]

刷算笔记 [C语言描述]

1. [力扣24] 两两交换链表中的节点🍧

题目描述

给定一个链表,两两交换其中相邻的节点,并返回交换后的链表。(题目指定要利用栈)

示例 1:

假如输入

copy
输入:head = [1,2,3,4]

应当输出

copy
输出:[2,1,4,3]
copy
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 。

假如输入

copy
示例1——输入:nums = [4,5,6,7,0,1,2], target = 0 示例2——输入:nums = [4,5,6,7,0,1,2], target = 3

应当输出

copy
示例1——输出:4 示例2——输出:-1
copy
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] 二叉树的右视图🍧

题目描述

给定一棵二叉树,想象自己站在它的右侧,按照从顶部到底部的顺序,返回从右侧所能看到的节点值。

假如输入

copy
输入: [1,2,3,null,5,null,4]

应当输出

copy
输出: [1, 3, 4] 解释: 1 <--- / \ 2 3 <--- \ \ 5 4 <---
copy
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 。

整个树 的坡度就是其所有节点的坡度之和。

假如输入

copy
输入:root = [1,2,3]

应当输出

copy
输出:1 解释: 节点 2 的坡度:|0-0| = 0(没有子节点) 节点 3 的坡度:|0-0| = 0(没有子节点) 节点 1 的坡度:|2-3| = 1(左子树就是左子节点,所以和是 2 ;右子树就是右子节点,所以和是 3 ) 坡度总和:0 + 0 + 1 = 1
copy
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。

假如输入

copy
示例1——输入:text1 = "abcde", text2 = "ace" 示例2——输入:text1 = "abc", text2 = "abc"

应当输出

copy
示例1——输出:3 示例2——输出:3 //解释:最长公共子序列是 "ace",它的长度为 3。 //解释:最长公共子序列是 "abc",它的长度为 3。
copy
/* 解题思路: 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天准备吃的时候只剩下一个桃子。聪明的你,请帮悟空算一下,他第一天开始吃的时候桃子一共有多少个呢?

输入描述:

copy
/* 输入数据有多组,每组占一行,包含一个正整数n(1<n〈30),表示只剩下一个桃子的时候是在第n天发生的。 */ 1 4

输出描述:

copy
/* 对于每组输入数据,输出第一天开始吃的时似桃子的总数,每个测试实例占一行。 */ 4

代码如下:

copy
# 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; }
posted @   梁君牧  阅读(397)  评论(0编辑  收藏  举报
点击右上角即可分享
微信分享提示
🚀