力扣(LeetCode)刷题,简单+中等题(第36期)

news/2024/9/20 12:31:23

目录

第1题:连续的子数组和

第2题:连续数组

第3题:相交链表

第4题:目标和

第5题:最后一块石头的重量 II

第6题:构造矩形

第7题:零钱兑换 II

第8题:完全平方数

第9题:不同路径 II

第10题:石子游戏


力扣(LeetCode)定期刷题,每期10道题,业务繁重的同志可以看看我分享的思路,不是最高效解决方案,只求互相提升。

第1题:连续的子数组和

试题要求如下:

 

回答(C语言):

struct HashTable {int key, val;UT_hash_handle hh;
};bool checkSubarraySum(int* nums, int numsSize, int k) {int m = numsSize;if (m < 2) {return false;}struct HashTable* hashTable = NULL;struct HashTable* tmp = malloc(sizeof(struct HashTable));tmp->key = 0, tmp->val = -1;HASH_ADD_INT(hashTable, key, tmp);int remainder = 0;for (int i = 0; i < m; i++) {remainder = (remainder + nums[i]) % k;HASH_FIND_INT(hashTable, &remainder, tmp);if (tmp != NULL) {int prevIndex = tmp->val;if (i - prevIndex >= 2) {return true;}} else {tmp = malloc(sizeof(struct HashTable));tmp->key = remainder, tmp->val = i;HASH_ADD_INT(hashTable, key, tmp);}}return false;
}

运行效率如下所示:


第2题:连续数组

试题要求如下:

回答(C语言):

#include <stdio.h>int findMaxLength(int* nums, int numsSize){int *hash = (int *)malloc(sizeof(int) * (numsSize * 2 + 1));for (int i = 0; i < (numsSize * 2 + 1); i++) {hash[i] = -2;}int maxlen = 0;int count = 0;hash[numsSize] = -1;for (int i = 0; i < numsSize; i++) {count += nums[i] == 0 ? -1 : 1;if (hash[count + numsSize] != -2) {maxlen = fmax(maxlen, i - hash[count+numsSize]);} else {hash[count + numsSize] = i;}}free(hash);return maxlen;
}

运行效率如下所示:


第3题:相交链表

试题要求如下:

回答(C语言):

/*** Definition for singly-linked list.* struct ListNode {*     int val;*     struct ListNode *next;* };*/
struct ListNode *getIntersectionNode(struct ListNode *headA, struct ListNode *headB) {struct ListNode *p=headA, *q=headB;while(p!=q&&(p!=NULL||q!=NULL)){if(p==NULL)p=headB;else p=p->next;if(q==NULL)q=headA;else q=q->next;}return p; 
}

运行效率如下所示:


第4题:目标和

试题要求如下:

回答(C语言):

int findTargetSumWays(int* nums, int numsSize, int target){int sum = 0;for (int i = 0; i < numsSize; i++) {sum += nums[i];}if ((sum + target) % 2 != 0) {return 0;}int targetA = (sum + target) / 2;int *dp = (int *)malloc(sizeof(int) * (targetA + 1));memset(dp, 0, sizeof(int) * (targetA + 1));dp[0] = 1;for (int i = 0; i < numsSize; i++) { for (int j = targetA; j >= nums[i]; j--) {dp[j] = dp[j] + dp[j - nums[i]];}}return dp[targetA];
}

运行效率如下所示:


第5题:最后一块石头的重量 II

试题要求如下:

回答(C语言):

int lastStoneWeightII(int* stones, int stonesSize) {int sum = 0;for (int i = 0; i < stonesSize; i++) {sum += stones[i];}int n = stonesSize, m = sum / 2;int dp[n + 1][m + 1];memset(dp, 0, sizeof(dp));dp[0][0] = true;for (int i = 0; i < n; ++i) {for (int j = 0; j <= m; ++j) {if (j < stones[i]) {dp[i + 1][j] = dp[i][j];} else {dp[i + 1][j] = dp[i][j] || dp[i][j - stones[i]];}}}for (int j = m;; --j) {if (dp[n][j]) {return sum - 2 * j;}}
}

运行效率如下所示:


第6题:构造矩形

试题要求如下:

解题思路:

这道题主要的难点是要找到两个相近且相乘为面积的长和宽,所以用开平方求得最中间的数,然后依次递减,找到可以被整除的数,即可。

回答(C语言):

/*** Note: The returned array must be malloced, assume caller calls free().*/
int* constructRectangle(int area, int* returnSize){*returnSize=2;int *a = (int *)malloc(sizeof(int)*2);int b = (int)sqrt(area);while(area % b !=0){b--;}a[1]=b;a[0]=area/b;return a;
}

运行效率如下所示:


第7题:零钱兑换 II

试题要求如下:

回答(C语言):

int change(int amount, int* coins, int coinsSize) {int dp[amount + 1];memset(dp, 0, sizeof(dp));dp[0] = 1;for (int i = 0; i < coinsSize; i++) {for (int j = coins[i]; j <= amount; j++) {dp[j] += dp[j - coins[i]];}}return dp[amount];
}

运行效率如下所示:


第8题:完全平方数

试题要求如下:

回答(C语言):

int numSquares(int n) {int f[n + 1];f[0] = 0;for (int i = 1; i <= n; i++) {int minn = INT_MAX;for (int j = 1; j * j <= i; j++) {minn = fmin(minn, f[i - j * j]);}f[i] = minn + 1;}return f[n];
}

运行效率如下所示:


第9题:不同路径 II

试题要求如下:

回答(C语言):

int uniquePathsWithObstacles(int** obstacleGrid, int obstacleGridSize, int* obstacleGridColSize) {/* 1、dp数组含义:从(0, 0)到当前行的第j列的路径数 */int dp[*obstacleGridColSize];/* 2、状态转移方程: * if (obstacleGrid[i][j] == 1) {*     dp[j] = 0;* } else {*     dp[j] += dp[j - 1];* } *//* 3、dp初值* 第一行当前列路障之前均为1,路障之后均为0*/if (obstacleGrid[0][0] == 1) {dp[0] = 0; } else {dp[0] = 1;}for (int j = 1; j < *obstacleGridColSize; j++) {if (obstacleGrid[0][j] == 1) {dp[j] = 0;} else {dp[j] = dp[j - 1];}}/* 4、遍历顺序:从左到右一层一层遍历 */for (int i = 1; i < obstacleGridSize; i++) {for (int j = 0; j < *obstacleGridColSize; j++) {if (j == 0) {   /* 开头 */if (obstacleGrid[i][j] == 1) {/* 当前路径上有路障:dp为0 */dp[j] = 0;} else {/* 当前路径上没有路障:跳过 */continue;}} else {    /* 非开头 */if (obstacleGrid[i][j] == 1) {/* 当前路径上有路障:dp为0 */dp[j] = 0;} else {/* 当前路径上没有路障:计算路径数 */dp[j] += dp[j - 1];} }}}return dp[*obstacleGridColSize - 1];
}

运行效率如下所示:


第10题:石子游戏

试题要求如下:

回答(C语言):

bool stoneGame(int* piles, int pilesSize) {int dp[pilesSize][pilesSize];for (int i = 0; i < pilesSize; i++) {dp[i][i] = piles[i];}for (int i = pilesSize - 2; i >= 0; i--) {for (int j = i + 1; j < pilesSize; j++) {dp[i][j] = fmax(piles[i] - dp[i + 1][j], piles[j] - dp[i][j - 1]);}}return dp[0][pilesSize - 1] > 0;
}

运行效率如下所示:

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.pgtn.cn/news/18609.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈,一经查实,立即删除!

相关文章

LabVIEW图像分割算法(基础篇—6)

目录 1、图像阈值分割 1.1、全局阈值分割 1.1.1、手动阈值分割 1.1.2、自动阈值分割 1.2、局部阈值分割 1.3、阈值分割算法比较 2、图像边缘分割 2.1、点检测 2.2、线检测 2.3、轮廓提取 3、图像形态学分割 3.1、像素的形态学处理 3.2、颗粒的形态学处理 4、图像…

Microsoft Anti-Cross Site Scripting Library V1.5 发布了

Microsoft Anti-Cross Site Scripting Library V1.5 发布了 微软反跨站攻击脚本库 v1.5。此下载包含Microsoft Application Security Anti-Cross Site Scripting Library的分发组件.Anti-Cross Site Scripting Library可以为网站开发人员提供基于Web应用防护,以抵御源自 Cross-…

1数字图像获取:1.2图像灰度直方图

----------1图像灰度直方图的概念------ 灰度直方图是反映一幅图像中各灰度级像素出现的频率与灰度级的关系。以灰度级为横坐标&#xff0c;频率为纵坐标绘制频率同灰度级的关系图就是一副灰度图像的直方图。他是一个图像的重要特征&#xff0c;反映了图像分布灰度的状况。暗图…

和12岁小同志搞创客开发:两个控制器之间如何实现通信?

目录 1、有线通信 2、无线通信 3、串口点灯 机缘巧合在网上认识一位12岁小同志&#xff0c;从零开始系统辅导其创客开发思维和技巧。 ​​​项目专栏&#xff1a;https://blog.csdn.net/m0_38106923/category_11097422.html 本篇博客来讲讲如何实现两个控制器之间数据通信&…

和12岁小同志搞创客开发:设计一款亮度可调节灯

机缘巧合在网上认识一位12岁小同志&#xff0c;从零开始系统辅导其创客开发思维和技巧。 ​​​项目专栏&#xff1a;https://blog.csdn.net/m0_38106923/category_11097422.html 本篇博客来设计一款亮度可调节灯&#xff0c;一起看看吧~ 亮度可调节灯&#xff0c;重点在于可…

1数字图像获取:1.3图像处理算法的形式

图像处理算法就是利用数学原理与计算机程序对数字图像进行处理的基础。 局部处理的例子&#xff1a;对一幅图像采用3x3模板进行卷积运算&#xff0c;用3x3的模板在该图像上进行扫描式的平移&#xff0c;每一个像素的卷积计算值是由并仅由该像素本身和该像素的8邻域像素的计算总…

DateReader,DateAdapter,DateSet和SqlCommand的基本使用方法

1usingSystem;2usingSystem.Data;3usingSystem.Data.SqlClient;45namespaceDemo36{ 7 /**//// <summary> 8 /// Class1 的摘要说明。 9 /// </summary>10 class Class111 {12 /**//// <summary>13 /// 应用程序的主入口点。14 /// </summary>15 [S…

LabVIEW图像灰度测量(基础篇—7)

像素灰度是图像最为典型的特征之一&#xff0c;基于图像像素灰度能衍生更多的图像特征&#xff0c;包括图像的直方图、线灰度分布曲线、图像线灰度均值、ROl边界灰度曲线、灰度定量描述以及图像结构相似度等&#xff0c;如下图所示&#xff1a; 拓展学习&#xff1a;LabVIEW图像…