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

目录

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

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

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

第4题:乘积最大子数组

第5题:不同路径

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

第7题:摆动序列

第8题:单调递增的数字

第9题:移除链表元素

第10题:计数二进制子串


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

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

试题要求如下:

回答(C语言):


  
  1. #define SIZE 10001
  2. bool isPossible(int* nums, int numsSize){
  3. int one[SIZE] = {0};
  4. int two[SIZE] = {0};
  5. int safe[SIZE] = {0};
  6. int oneSize = 0;
  7. int twoSize = 0;
  8. int now;
  9. int minValue = nums[0] - 1;
  10. for (int i = 0; i < numsSize; ++i) {
  11. now = nums[i] - 1 - minValue;
  12. if (one[now] == 0 && two[now] == 0 && safe[now] == 0) {
  13. ++one[now + 1];
  14. ++oneSize;
  15. } else if (one[now] > 0) {
  16. ++two[now + 1];
  17. --one[now];
  18. --oneSize;
  19. ++twoSize;
  20. } else if (two[now] > 0) {
  21. ++safe[now + 1];
  22. --two[now];
  23. --twoSize;
  24. } else{
  25. ++safe[now + 1];
  26. --safe[now];
  27. }
  28. }
  29. return twoSize == 0 && oneSize == 0;
  30. }

运行效率如下所示:


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

试题要求如下:

解题思路:

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

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

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

回答(C语言):


  
  1. int matrixScore(int** A, int ASize, int* AColSize) {
  2. int m = ASize, n = AColSize[0];
  3. int ret = m * (1 << (n - 1));
  4. for (int j = 1; j < n; j++) {
  5. int nOnes = 0;
  6. for (int i = 0; i < m; i++) {
  7. if (A[i][0] == 1) {
  8. nOnes += A[i][j];
  9. } else {
  10. nOnes += (1 - A[i][j]); // 如果这一行进行了行反转,则该元素的实际取值为 1 - A[i][j]
  11. }
  12. }
  13. int k = fmax(nOnes, m - nOnes);
  14. ret += k * (1 << (n - j - 1));
  15. }
  16. return ret;
  17. }

运行效率如下所示:


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

试题要求如下:

回答(C语言):


  
  1. int findMin(int* nums, int numsSize){
  2. int left = 0,right = numsSize-1,mid;
  3. while(left < right)
  4. {
  5. mid = left + (right - left)/2;
  6. if(nums[mid]>nums[right])
  7. {
  8. left = mid + 1;
  9. }
  10. else
  11. {
  12. right = mid;
  13. }
  14. }
  15. return nums[left];
  16. }

运行效率如下所示:


第4题:乘积最大子数组

试题要求如下:

回答(C语言):


  
  1. #define MAX(A,B) A>B?A:B
  2. #define MIN(A,B) A<B?A:B
  3. int maxProduct(int* nums, int numsSize){
  4. int imax = 1, imin = 1, res = nums[0];
  5. int tmp,i;
  6. for(i = 0; i < numsSize; i++)
  7. {
  8. if(nums[i] < 0)
  9. {
  10. tmp = imax;
  11. imax = imin;
  12. imin = tmp;
  13. }
  14. imax = MAX(imax * nums[i], nums[i]);
  15. imin = MIN(imin * nums[i], nums[i]);
  16. res = MAX(imax, res);
  17. }
  18. return res;
  19. }

运行效率如下所示:


第5题:不同路径

试题要求如下:

回答(C语言):


  
  1. int uniquePaths(int m, int n) {
  2. int f[m][n];
  3. for (int i = 0; i < m; ++i) {
  4. f[i][0] = 1;
  5. }
  6. for (int j = 0; j < n; ++j) {
  7. f[0][j] = 1;
  8. }
  9. for (int i = 1; i < m; ++i) {
  10. for (int j = 1; j < n; ++j) {
  11. f[i][j] = f[i - 1][j] + f[i][j - 1];
  12. }
  13. }
  14. return f[m - 1][n - 1];
  15. }

运行效率如下所示:


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

试题要求如下:

回答(C语言):


  
  1. #define MAX 1001
  2. bool isPathCrossing(char * path){
  3. if(path==NULL) return false;
  4. int hash[MAX][MAX]={0};
  5. int x=500,y=500;
  6. hash[x][y]=1;//zero point is 1
  7. for(int i=0; i<strlen(path); i++){
  8. if(path[i]=='N'){
  9. if(hash[x][y+1]==1) return true;
  10. else hash[x][++y]=1;
  11. }
  12. if(path[i]=='S'){
  13. if(hash[x][y-1]==1) return true;
  14. else hash[x][--y]=1;
  15. }
  16. if(path[i]=='W'){
  17. if(hash[x-1][y]==1) return true;
  18. else hash[--x][y]=1;
  19. }
  20. if(path[i]=='E'){
  21. if(hash[x+1][y]==1) return true;
  22. else hash[++x][y]=1;
  23. }
  24. }
  25. return false;
  26. }

运行效率如下所示:


第7题:摆动序列

试题要求如下:

回答(C语言):


  
  1. int wiggleMaxLength(int* nums, int numsSize) {
  2. if (numsSize < 2) {
  3. return numsSize;
  4. }
  5. int up = 1, down = 1;
  6. for (int i = 1; i < numsSize; i++) {
  7. if (nums[i] > nums[i - 1]) {
  8. up = fmax(up, down + 1);
  9. } else if (nums[i] < nums[i - 1]) {
  10. down = fmax(up + 1, down);
  11. }
  12. }
  13. return fmax(up, down);
  14. }

运行效率如下所示:


第8题:单调递增的数字

试题要求如下:

回答(C语言):


  
  1. int monotoneIncreasingDigits(int N){
  2. bool isInc = true;
  3. int mod = N % 10;
  4. int curr = N / 10;
  5. int multi = 10;
  6. int lastNum = curr;
  7. int lastMulti = multi;
  8. while(curr > 0) {
  9. if (mod < curr % 10) {
  10. isInc = false;
  11. lastNum = curr;
  12. lastMulti = multi;
  13. curr -= 1; // 不单调递减时去前面借一位
  14. }
  15. mod = curr % 10;
  16. curr /= 10;
  17. multi *= 10;
  18. }
  19. if (isInc == false) {
  20. return lastNum * lastMulti - 1;
  21. }
  22. return N;
  23. }

运行效率如下所示:


第9题:移除链表元素

试题要求如下:

回答(C语言):


  
  1. /**
  2. * Definition for singly-linked list.
  3. * struct ListNode {
  4. * int val;
  5. * struct ListNode *next;
  6. * };
  7. */
  8. struct ListNode* removeElements(struct ListNode* head, int val){
  9. if (head == NULL) {
  10. return NULL;
  11. }
  12. /* 删除 head 节点后面值为 val 的元素的节点 */
  13. struct ListNode* res = removeElements(head->next, val);
  14. /* head 节点是要删除的节点 */
  15. if (head->val == val) {
  16. return res;
  17. } else {
  18. head->next = res;
  19. return head;
  20. }
  21. }

运行效率如下所示:


第10题:计数二进制子串

试题要求如下:

回答(C语言):


  
  1. int countBinarySubstrings(char* s) {
  2. int ptr = 0, n = strlen(s), last = 0, ans = 0;
  3. while (ptr < n) {
  4. char c = s[ptr];
  5. int count = 0;
  6. while (ptr < n && s[ptr] == c) {
  7. ++ptr;
  8. ++count;
  9. }
  10. ans += fmin(count, last);
  11. last = count;
  12. }
  13. return ans;
  14. }

运行效率如下所示

文章来源: handsome-man.blog.csdn.net,作者:不脱发的程序猿,版权归原作者所有,如需转载,请联系作者。

原文链接:handsome-man.blog.csdn.net/article/details/110467580

(完)