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

刷算笔记 [C语言描述]

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

题目描述

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

示例 1:

假如输入

输入: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;
}
posted @ 2020-11-17 16:15  梁君牧  阅读(393)  评论(0编辑  收藏  举报