力扣(LeetCode)刷题,简单题(第22期)
目錄
第1題:兩數之和IV—輸入BST
第2題:檸檬水找零
第3題:左葉子之和
第4題:第K個缺失的正整數
第5題:反轉字符串2
第6題:最小移動次數使數組元素相等
第7題:分發餅干
第8題:二叉樹的最小深度
第9題:消失的數字
第10題:多數元素
力扣(LeetCode)定期刷題,每期10道題,業務繁重的同志可以看看我分享的思路,不是最高效解決方案,只求互相提升。
第1題:兩數之和IV—輸入BST
試題要求如下:
解答思路:
1、使用中序遍歷把結果存在數組中;
2、用雙指針(即下標),來找對應結果是否存在 i指向最小,j指向最大。若i+j小于目標值,那么i++,i+j大于>目標值,則j--。
回答(C語言):
#define Maxsize 10000void inorder(struct TreeNode* root,int *nums,int* length);bool findTarget(struct TreeNode* root, int k){int i=0,j=-1; //j記錄最大值的下標(即數組最后一個元素),把其指針傳給inorder函數int* nums=(int*)malloc(Maxsize*sizeof(int)); inorder(root,nums,&j);while(i<j) //循環判斷數組中是否存在兩數之和等于k的情況{if(nums[i]+nums[j]==k) return true;else if(nums[i]+nums[j]<k) i++;else j--;}return false;
}void inorder(struct TreeNode* root,int *nums,int* length){ //遞歸中序遍歷二叉搜索樹,并且把結果存在數組中if(root==NULL) return;inorder(root->left,nums,length);nums[++(*length)]=root->val;inorder(root->right,nums,length);
}
運行效率如下所示:
第2題:檸檬水找零
試題要求如下:
回答(C語言):
bool lemonadeChange(int*a, int n)
{if (a == NULL || n <= 0) {return false;} int s5 = 0, s10 = 0, s20 = 0;for (int i = 0; i < n; i++) {switch (a[i]) {case 20: // 給20找15元 if (s10 > 0 && s5 > 0) {s20++, s10--, s5--;continue; // 找開了 }if (s5 > 3) {s20++, s5 -= 3;continue; // 找開了}return false;case 10: //給10元找5元 if (s5 > 0) {s10++, s5--;continue; // 找開了}return false;case 5: // 給5元s5++;continue; // 不找錢 default: // 其他都失敗 return false;}}return true;
}
運行效率如下所示:
第3題:左葉子之和
試題要求如下:
回答(C語言):
/*** Definition for a binary tree node.* struct TreeNode {* int val;* struct TreeNode *left;* struct TreeNode *right;* };*/int sumOfLeftLeaves(struct TreeNode* root){if(!root) return 0;int sum=0;if(root->left){if(!root->left->left&&!root->left->right){sum+=root->left->val;}else{sum+=sumOfLeftLeaves(root->left);}}if(root->right){sum+=sumOfLeftLeaves(root->right);}return sum;
}
運行效率如下所示:
第4題:第K個缺失的正整數
試題要求如下:
回答(C語言):
int findKthPositive(int* arr, int arrSize, int k){int i = 0, cnt=0, hash[10000] = {0};for(i=0;i<arrSize;i++){hash[arr[i]]++; //記錄出現次數,arr[i]對應下標的hash表值hash[arr[i]]就不會為0}for(i=1;i<10000;i++){if(hash[i]==0){cnt++;}if(cnt==k){ //找到第k個為0的元素,它也就是第k個沒有出現的元素,返回對應下標即可break;}}return i;
}
運行效率如下所示:
第5題:反轉字符串2
試題要求如下:
回答(C語言):
char * reverseStr(char * s, int k){//每2k個翻轉前k個//不足2k但大于等于1k,翻轉前k個字符剩下的不變//小于k個字符,全部翻轉int len = strlen(s);for(int i=0; i<len; i+=2*k){int left = i;int right = (i + k - 1 < len) ? i + k - 1 : len - 1;while(left<right){char c = s[left];s[left++] = s[right];s[right--] = c;} }return s;
}
運行效率如下所示:
第6題:最小移動次數使數組元素相等
試題要求如下:
解題思路:
n - 1個數加1即1個數減1,因此只需算sum(nums) - numsSize * min。
回答(C語言):
int minMoves(int* nums, int numsSize){int ret = 0;int min = nums[0];for(int i = 0;i < numsSize;i++){if(nums[i] < min){min = nums[i];}}for(int i = 0;i < numsSize;i++){ret = ret + nums[i] - min;}return ret;
}
運行效率如下所示:
第7題:分發餅干
試題要求如下:
解題思路:
采用貪心算法的思路,此問題的貪心選擇是“先把胃口最小的孩子滿足,再滿足之后的,如果當前胃口最小的孩子都沒滿足那么已經終止分配了”。
回答(C語言):
int cmp(const void *a, const void *b) {return (*(int*)a - *(int*)b);
}int findContentChildren(int* g, int gSize, int* s, int sSize){qsort(g, gSize, sizeof(int), cmp);qsort(s, sSize, sizeof(int), cmp);int i = 0, j = 0;int count = 0;while (i < gSize && j < sSize) {if (g[i] <= s[j]) {i++;count++;}j++;}return count;
}
運行效率如下所示:
第8題:二叉樹的最小深度
試題要求如下:
解題思路:
1、二叉樹為空樹,最小深度為0;
2、二叉樹不為空樹,兩子樹均不為空,獲取左右子樹的最小深度,取最小的那個加1;
3、二叉樹不為空樹,但兩子樹其中之一為空,最小深度為子樹不為空的最小深度加1。
回答(C語言):
/*** Definition for a binary tree node.* struct TreeNode {* int val;* struct TreeNode *left;* struct TreeNode *right;* };*/#define min(A, B) ((A) < (B) ? (A) : (B))
int minDepth(struct TreeNode* root){if (root == NULL) {return 0;}int left = minDepth(root->left);int right = minDepth(root->right);return (left && right) ? min(left, right) + 1 : left + right + 1;
}
運行效率如下所示:
第9題:消失的數字
試題要求如下:
回答(C語言):
int missingNumber(int* nums, int numsSize){int sum = 0;for(int i = 0; i < numsSize; i++){sum += nums[i];}return ((numsSize * (1 + numsSize))/2) - sum;
}
運行效率如下所示:
第10題:多數元素
試題要求如下:
解答思路:
摩爾投票法,通過一個計數變量s,來觀察哪一個數最后不是0即為majority;相同加,不相同減,變為0后換下一個。
回答(C語言):
int majorityElement(int* nums, int numsSize){int s = 1;int maj = nums[0];for (int i = 1; i < numsSize; i++) {if (maj == nums[i]){s++;}else {s--;}if (s == 0) {maj = nums[i + 1];}}return maj;
}
運行效率如下所示:
總結
以上是生活随笔為你收集整理的力扣(LeetCode)刷题,简单题(第22期)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 为什么不推荐使用汉字作为密码?
- 下一篇: EMC设计中电缆屏蔽使用方法