力扣刷题记录7(无算法背景,纯C语言)

37、最小路径和(64动态规划)

cpp 复制代码
int minPathSum(int** grid, int gridSize, int* gridColSize) 
{

    int n = gridSize;//行
    int m = *gridColSize; //列
    if(n == 0|| m == 0)return 0;
    for(int i = 1; i < m ; i++)//把第一行的最短路径计算了
    {
        grid[0][i] += grid[0][i - 1];
    }
    for(int i = 1; i < n ; i++)
    {
        grid[i][0] += grid[i - 1][0];
    }
    for(int i = 1; i < n ; i++)
    {
        for(int j = 1; j < m ; j++)
        {
            grid[i][j] = grid[i][j] + fmin(grid[i][j - 1],grid[i - 1][j]);
        }
    }
    return grid[n-1][m-1];
}

38、打家劫舍(198动态规划)

cpp 复制代码
int rob(int* nums, int numsSize) 
{
    if(numsSize == 0)return 0;
    int pre1 = nums[0];
    int pre2 = 0;
    for(int i = 1; i < numsSize; i++)
    {
        int current = fmax(pre1, pre2 + nums[i]);
        pre2 = pre1;
        pre1 = current;
    }
    return pre1;
}

39、跳跃游戏(55贪心)

保留最大步即可

cpp 复制代码
bool canJump(int* nums, int numsSize) 
{
    if(numsSize <= 1)return true;
    int max = nums[0];
    for(int i = 1; i < numsSize - 1; i ++)
    {
        max -= 1; 
        if(max < 0) return false;
        if(max < nums[i])max = nums[i];
    }    
    if(max > 0)return true;
    return false;
}

40、跳跃游戏II(45贪心)

cpp 复制代码
int jump(int* nums, int numsSize) 
{
    int distance = numsSize - 1 - nums[0];//离终点距离
    int position = 0;
    int count = 1;//计数
    if(numsSize <= 1)return 0;
    //从nums[i]的距离内选一个能跳最远的,每次++count
    while(distance > 0)
    {
        int new_position = 0;
        for(int i = position + 1; i <= (position + nums[position]); i++)
        {
            int new_distance = numsSize - i - 1 - nums[i];
            if(distance > new_distance)
            {
                distance = new_distance;
                new_position = i;
            }
        }
        position = new_position;
        count++;
    }
    return count;
}

41、腐烂的橘子(994广度优先搜索)

cpp 复制代码
int orangesKuozhan(int** grid, int gridSize, int* gridColSize, int i, int j)
{
    if(i >= 0 && i < gridSize && j >= 0 && j < * gridColSize)
    {
        if(grid[i][j] == 1)
        {
            grid[i][j] = 2;
            return 1;
        }
    }
    return 0;
}

//使用广度优先搜索,对腐烂果子进行放进队列,出列后再处理新的,每遍历一次++一次时间
int orangesRotting(int** grid, int gridSize, int* gridColSize) 
{
    int day = 0;
    int queue[100][2];
    int head = 0;//队列头
    int tail = 0;//队列尾巴
    int isgoodnum = 0;
    //找全部坏果
    for(int i = 0; i < gridSize; i++)
    {
        for(int j = 0; j < *gridColSize; j++)
        {
            if(grid[i][j] == 2)
            {
                queue[head][0]= i;
                queue[head][1]= j;
                head++;
            }
            else if(grid[i][j] == 1)isgoodnum++;
        }
    }
    //把坏果上下左右遍历一遍,计算时间
    while(tail < head && isgoodnum > 0)
    {
        int count = head - tail;
        bool flag = false;
        //同一时间坏的,下一时间同时扩展腐烂的橘子
        for(int k = 0; k < count; k++)
        {
            int i = queue[tail][0];
            int j = queue[tail][1];
            if(orangesKuozhan(grid, gridSize, gridColSize, i + 1, j))
            {
                isgoodnum--;
                queue[head][0]= i + 1;
                queue[head][1]= j;
                head++;
                flag = true;
            }
            if(orangesKuozhan(grid, gridSize, gridColSize, i - 1, j))
            {
                isgoodnum--;
                queue[head][0]= i - 1;
                queue[head][1]= j;
                head++;
                flag = true;
            }
            if(orangesKuozhan(grid, gridSize, gridColSize, i, j + 1))
            {
                isgoodnum--;
                queue[head][0]= i;
                queue[head][1]= j + 1;
                head++;
                flag = true;
            }
            if(orangesKuozhan(grid, gridSize, gridColSize, i, j - 1))
            {
                isgoodnum--;
                queue[head][0]= i;
                queue[head][1]= j - 1;
                head++;
                flag = true;       
            }
            tail++;
        }
        if(flag)day++;

    }
    if(isgoodnum > 0)return -1;
    return day;
}

42、全排列(46回溯)

cpp 复制代码
/**
 * Return an array of arrays of size *returnSize.
 * The sizes of the arrays are returned as *returnColumnSizes array.
 * Note: Both returned array and *columnSizes array must be malloced, assume caller calls free().
 */

void huishu(int* nums, int numsSize, bool *use, int *path, int depth, int** res, int* returnSize)
{
    //depth会比numsSize多+1,相等的时候path数组刚刚存满,记录后return即可
    if(depth == numsSize)
    {
        for(int i = 0; i < numsSize; i++)
        {
            res[*returnSize][i] = path[i];
        }
        (*returnSize)++;
        return;
    }
    //每一个depth都会进行numsSize次操作,每个都选一遍
    for(int i = 0; i < numsSize; i++)
    {
        //找false,如果是ture跳过操作
        if(use[i]) continue;
        path[depth] = nums[i];
        use[i] = true;
        huishu(nums, numsSize, use, path, depth+1, res, returnSize);
        use[i] = false;
    }
}


int** permute(int* nums, int numsSize, int* returnSize, int** returnColumnSizes) 
{
    * returnSize = 0;
    if(numsSize == 0)return 0;
    //计算排列数量
    int total = 1;
    for(int i =1; i <= numsSize; i++)
    {
        total *= i;
    }   
    //开辟返回数组空间,提前记录返回数组大小
    int** res = (int **)malloc(sizeof(int*)*total);
    * returnColumnSizes = (int *)malloc(sizeof(int)*total);
    for(int i = 0; i < total; i++)
    {
        res[i] = (int *)malloc(sizeof(int)*numsSize);
        (*returnColumnSizes)[i] = numsSize;
    }
    //使用过的数进行标记
    bool use[numsSize];
    for(int i=0; i<numsSize; i++) use[i] = false;
    //当前组合的数字,需要放入res的
    int path[numsSize];
    //记录递归层数
    int depth = 0;
    huishu(nums, numsSize, use, path, depth, res, returnSize);
    return res;
}
相关推荐
lzhdim10 小时前
AI的分类
人工智能·算法·机器学习·分类·数据挖掘
凤凰院凶涛QAQ13 小时前
《Java版数据结构 & 集合类剖析》Map & Set & 反射:“从哈希碰撞到红黑树转换,反射帮你扒开 HashMap 的桶数组看个究竟”
java·数据结构·算法
w_zero_one15 小时前
算法--模拟
java·数据结构·算法
秋天的怀念_David15 小时前
算法一千零一夜 · 第十三夜 幻方,武侠世界里的数学迷宫
java·程序人生·算法
·present·16 小时前
CSAPP(lecture 4_01)
c语言·c++
秋天的怀念_David16 小时前
算法一千零一夜 · 第十四夜 幻方与奇妙的二进制
java·程序人生·算法
薛定e的猫咪16 小时前
(ICLR 2020)MAML 靠的不是快速学习,而是特征复用
人工智能·深度学习·学习·算法·机器学习
薛定e的猫咪16 小时前
(ICLR 2026)DF-META:面向 FJSP 的无导数元学习实例自适应调度
人工智能·深度学习·学习·算法·机器学习
java_nnnn18 小时前
LeetCode刷题滑动窗口(水果成篮+找到字符串中所有字母的异位词)Java
java·开发语言·leetcode
小羊没烦恼!18 小时前
异步编程:线程概述及使用
java·开发语言·mysql·算法·c#