c语言int s(int one),力扣(LeetCode)刷题,简单+中等题(第29期)

目录

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

试题要求如下:

b5992b8f0ff7f73a6649ec41d8fb492d.png

回答(C语言):

#define SIZE 10001

bool isPossible(int* nums, int numsSize){

int one[SIZE] = {0};

int two[SIZE] = {0};

int safe[SIZE] = {0};

int oneSize = 0;

int twoSize = 0;

int now;

int minValue = nums[0] - 1;

for (int i = 0; i < numsSize; ++i) {

now = nums[i] - 1 - minValue;

if (one[now] == 0 && two[now] == 0 && safe[now] == 0) {

++one[now + 1];

++oneSize;

} else if (one[now] > 0) {

++two[now + 1];

--one[now];

--oneSize;

++twoSize;

} else if (two[now] > 0) {

++safe[now + 1];

--two[now];

--twoSize;

} else{

++safe[now + 1];

--safe[now];

}

}

return twoSize == 0 && oneSize == 0;

}

运行效率如下所示:

633aaed298cd8441939c40f4afc4d90a.png

试题要求如下:

bf8ce4de1a7c71d94e4521ff14b0d969.png

解题思路:

为了得到最高的分数,矩阵的每一行的最左边的数都必须为 1。为了做到这一点,可以翻转那些最左边的数不为 1 的那些行,而其他的行则保持不动。

当将每一行的最左边的数都变为 1 之后,就只能进行列翻转了。为了使得总得分最大,我们要让每个列中 1 的数目尽可能多。

因此,扫描除了最左边的列以外的每一列,如果该列 0 的数目多于 1 的数目,就翻转该列,其他的列则保持不变。

回答(C语言):

int matrixScore(int** A, int ASize, int* AColSize) {

int m = ASize, n = AColSize[0];

int ret = m * (1 << (n - 1));

for (int j = 1; j < n; j++) {

int nOnes = 0;

for (int i = 0; i < m; i++) {

if (A[i][0] == 1) {

nOnes += A[i][j];

} else {

nOnes += (1 - A[i][j]); // 如果这一行进行了行反转,则该元素的实际取值为 1 - A[i][j]

}

}

int k = fmax(nOnes, m - nOnes);

ret += k * (1 << (n - j - 1));

}

return ret;

}

运行效率如下所示:

773d0cfd5db3bc5ecf0b17cf06640752.png

试题要求如下:

0841afa757bd881574be96efebc1ee30.png

回答(C语言):

int findMin(int* nums, int numsSize){

int left = 0,right = numsSize-1,mid;

while(left < right)

{

mid = left + (right - left)/2;

if(nums[mid]>nums[right])

{

left = mid + 1;

}

else

{

right = mid;

}

}

return nums[left];

}

运行效率如下所示:

fcf584cfd10456798d7fc6185e699793.png

试题要求如下:

49c12fbc7e45bb932eaed762a6c4c59f.png

回答(C语言):

#define MAX(A,B) A>B?A:B

#define MIN(A,B) A

int maxProduct(int* nums, int numsSize){

int imax = 1, imin = 1, res = nums[0];

int tmp,i;

for(i = 0; i < numsSize; i++)

{

if(nums[i] < 0)

{

tmp = imax;

imax = imin;

imin = tmp;

}

imax = MAX(imax * nums[i], nums[i]);

imin = MIN(imin * nums[i], nums[i]);

res = MAX(imax, res);

}

return res;

}

运行效率如下所示:

e44605da447d1fbf9708247ae10677b3.png

第5题:不同路径

试题要求如下:

e9d11a414d83a797c80058c403bc9776.png

回答(C语言):

int uniquePaths(int m, int n) {

int f[m][n];

for (int i = 0; i < m; ++i) {

f[i][0] = 1;

}

for (int j = 0; j < n; ++j) {

f[0][j] = 1;

}

for (int i = 1; i < m; ++i) {

for (int j = 1; j < n; ++j) {

f[i][j] = f[i - 1][j] + f[i][j - 1];

}

}

return f[m - 1][n - 1];

}

运行效率如下所示:

0f189ddf50982d21eb0de2c382f22589.png

试题要求如下:

76787b9b1980db9daac53b2d9469c051.png

回答(C语言):

#define MAX 1001

bool isPathCrossing(char * path){

if(path==NULL) return false;

int hash[MAX][MAX]={0};

int x=500,y=500;

hash[x][y]=1;//zero point is 1

for(int i=0; i

if(path[i]=='N'){

if(hash[x][y+1]==1) return true;

else hash[x][++y]=1;

}

if(path[i]=='S'){

if(hash[x][y-1]==1) return true;

else hash[x][--y]=1;

}

if(path[i]=='W'){

if(hash[x-1][y]==1) return true;

else hash[--x][y]=1;

}

if(path[i]=='E'){

if(hash[x+1][y]==1) return true;

else hash[++x][y]=1;

}

}

return false;

}

运行效率如下所示:

dc3322f5e5271a1a7957b526861b2cb7.png

第7题:摆动序列

试题要求如下:

00f5081ba5dbf189ac02760674b186c9.png

回答(C语言):

int wiggleMaxLength(int* nums, int numsSize) {

if (numsSize < 2) {

return numsSize;

}

int up = 1, down = 1;

for (int i = 1; i < numsSize; i++) {

if (nums[i] > nums[i - 1]) {

up = fmax(up, down + 1);

} else if (nums[i] < nums[i - 1]) {

down = fmax(up + 1, down);

}

}

return fmax(up, down);

}

运行效率如下所示:

75873dd70084fa957e07d66e06b43b12.png

试题要求如下:

e231f905b316d3a5b90e9e07413756d7.png

回答(C语言):

int monotoneIncreasingDigits(int N){

bool isInc = true;

int mod = N % 10;

int curr = N / 10;

int multi = 10;

int lastNum = curr;

int lastMulti = multi;

while(curr > 0) {

if (mod < curr % 10) {

isInc = false;

lastNum = curr;

lastMulti = multi;

curr -= 1; // 不单调递减时去前面借一位

}

mod = curr % 10;

curr /= 10;

multi *= 10;

}

if (isInc == false) {

return lastNum * lastMulti - 1;

}

return N;

}

运行效率如下所示:

e08199c3704f75ff4ddd7043c4e43b69.png

试题要求如下:

17afd0073430a90d376791560edf77b9.png

回答(C语言):

/**

* Definition for singly-linked list.

* struct ListNode {

* int val;

* struct ListNode *next;

* };

*/

struct ListNode* removeElements(struct ListNode* head, int val){

if (head == NULL) {

return NULL;

}

/* 删除 head 节点后面值为 val 的元素的节点 */

struct ListNode* res = removeElements(head->next, val);

/* head 节点是要删除的节点 */

if (head->val == val) {

return res;

} else {

head->next = res;

return head;

}

}

运行效率如下所示:

270f02f4372e415268fcbe6aa7557c0f.png

试题要求如下:

2445a3cd08c06d7b18f1249be0256aa7.png

回答(C语言):

int countBinarySubstrings(char* s) {

int ptr = 0, n = strlen(s), last = 0, ans = 0;

while (ptr < n) {

char c = s[ptr];

int count = 0;

while (ptr < n && s[ptr] == c) {

++ptr;

++count;

}

ans += fmin(count, last);

last = count;

}

return ans;

}

运行效率如下所示

f38f122d4f17d83834e6e59efc8785bf.png

本文同步分享在 博客“不脱发的程序猿”(CSDN)。

如有侵权,请联系 support@oschina.cn 删除。

本文参与“OSC源创计划”,欢迎正在阅读的你也加入,一起分享。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值