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

简介: 力扣(LeetCode)刷题,简单+中等题(第29期)

目录

第1题:分割数组为连续子序列


第2题:翻转矩阵后的得分


第3题:寻找旋转排序数组中的最小值


第4题:乘积最大子数组


第5题:不同路径


第6题:判断路径是否相交


第7题:摆动序列


第8题:单调递增的数字


第9题:移除链表元素


第10题:计数二进制子串


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


第1题:分割数组为连续子序列

试题要求如下:

image.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;
}

运行效率如下所示:


image.png


第2题:翻转矩阵后的得分

试题要求如下:

image.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;
}
运行效率如下所示:
第3题:寻找旋转排序数组中的最小值
试题要求如下:
回答(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];
}

运行效率如下所示:

image.png

第3题:寻找旋转排序数组中的最小值

试题要求如下:image.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];
}

运行效率如下所示:

image.png


第4题:乘积最大子数组

试题要求如下:

image.png


回答(C语言):


#define MAX(A,B) A>B?A:B
#define MIN(A,B) A<B?A:B
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;
}

运行效率如下所示:

image.png



第5题:不同路径

试题要求如下:

image.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];
}

运行效率如下所示:



image.png

第6题:判断路径是否相交

试题要求如下:

image.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<strlen(path); 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;
}

运行效率如下所示:


image.png


第7题:摆动序列

试题要求如下:



image.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);
}

运行效率如下所示:


image.png


第8题:单调递增的数字

试题要求如下:


image.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;
}

运行效率如下所示:


image.png


第9题:移除链表元素

试题要求如下:

image.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;
    }
}

运行效率如下所示:

image.png



第10题:计数二进制子串

试题要求如下:


image.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;
}

运行效率如下所示


image.png




相关文章
|
5天前
|
Unix Shell Linux
LeetCode刷题 Shell编程四则 | 194. 转置文件 192. 统计词频 193. 有效电话号码 195. 第十行
本文提供了几个Linux shell脚本编程问题的解决方案,包括转置文件内容、统计词频、验证有效电话号码和提取文件的第十行,每个问题都给出了至少一种实现方法。
LeetCode刷题 Shell编程四则 | 194. 转置文件 192. 统计词频 193. 有效电话号码 195. 第十行
|
2月前
|
搜索推荐 索引 Python
【Leetcode刷题Python】牛客. 数组中未出现的最小正整数
本文介绍了牛客网题目"数组中未出现的最小正整数"的解法,提供了一种满足O(n)时间复杂度和O(1)空间复杂度要求的原地排序算法,并给出了Python实现代码。
82 2
|
5天前
|
数据采集 负载均衡 安全
LeetCode刷题 多线程编程九则 | 1188. 设计有限阻塞队列 1242. 多线程网页爬虫 1279. 红绿灯路口
本文提供了多个多线程编程问题的解决方案,包括设计有限阻塞队列、多线程网页爬虫、红绿灯路口等,每个问题都给出了至少一种实现方法,涵盖了互斥锁、条件变量、信号量等线程同步机制的使用。
LeetCode刷题 多线程编程九则 | 1188. 设计有限阻塞队列 1242. 多线程网页爬虫 1279. 红绿灯路口
|
2月前
|
算法 Python
【Leetcode刷题Python】 LeetCode 2038. 如果相邻两个颜色均相同则删除当前颜色
本文介绍了LeetCode 2038题的解法,题目要求在一个由'A'和'B'组成的字符串中,按照特定规则轮流删除颜色片段,判断Alice是否能够获胜,并提供了Python的实现代码。
39 3
|
2月前
|
算法 Python
【Leetcode刷题Python】剑指 Offer 33. 二叉搜索树的后序遍历序列
本文提供了一种Python算法,用以判断给定整数数组是否为某二叉搜索树的后序遍历结果,通过识别根节点并递归验证左右子树的值是否满足二叉搜索树的性质。
17 3
|
2月前
|
Python
【Leetcode刷题Python】50. Pow(x, n)
本文介绍了LeetCode第50题"Pow(x, n)"的解法,题目要求实现计算x的n次幂的函数,文章提供了递归分治法的详细解析和Python实现代码。
18 1
|
2月前
|
Python
【Leetcode刷题Python】LeetCode 478. 在圆内随机生成点
本文介绍了LeetCode 478题的解法,题目要求在给定圆的半径和圆心位置的情况下实现在圆内均匀随机生成点的功能,并提供了Python的实现代码。
20 1
|
2月前
|
算法 Python
【Leetcode刷题Python】295. 数据流的中位数
本文介绍了一种使用Python实现的数据结构,用以支持数据流中添加整数并返回当前所有元素的中位数,通过排序列表来计算中位数。
17 1
|
2月前
|
算法 Python
【Leetcode刷题Python】73. 矩阵置零
本文介绍了LeetCode第73题的解法,题目要求在给定矩阵中将所有值为0的元素所在的行和列全部置为0,并提供了一种原地算法的Python实现。
19 0
【Leetcode刷题Python】73. 矩阵置零
|
2月前
|
Python
【Leetcode刷题Python】1467. 两个盒子中球的颜色数相同的概率
本文介绍了LeetCode第50题"Pow(x, n)"的解法,题目要求实现计算x的n次幂的函数,文章提供了递归分治法的详细解析和Python实现代码。
24 0