力扣刷题记录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;
}
相关推荐
CoderCodingNo5 小时前
【NOIP】2011真题解析 luogu-P1003 铺地毯 | GESP三、四级以上可练习
算法
iFlyCai5 小时前
C语言中的指针
c语言·数据结构·算法
查古穆6 小时前
栈-有效的括号
java·数据结构·算法
再一次等风来6 小时前
近场声全息(NAH)仿真实现:从阵列实值信号到波数域重建
算法·matlab·信号处理·近场声全息·nah
汀、人工智能6 小时前
16 - 高级特性
数据结构·算法·数据库架构·图论·16 - 高级特性
大熊背6 小时前
利用ISP离线模式进行分块LSC校正的方法
人工智能·算法·机器学习
XWalnut6 小时前
LeetCode刷题 day4
算法·leetcode·职场和发展
蒸汽求职6 小时前
机器人软件工程(Robotics SDE):特斯拉Optimus落地引发的嵌入式C++与感知算法人才抢夺战
大数据·c++·算法·职场和发展·机器人·求职招聘·ai-native
AI成长日志7 小时前
【笔面试算法学习专栏】双指针专题·简单难度两题精讲:167.两数之和II、283.移动零
学习·算法·面试
旖-旎7 小时前
分治(库存管理|||)(4)
c++·算法·leetcode·排序算法·快速选择算法