力扣(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语言):


  
  1. #define Maxsize 10000
  2. void inorder(struct TreeNode* root,int *nums,int* length);
  3. bool findTarget(struct TreeNode* root, int k){
  4. int i=0,j=-1; //j记录最大值的下标(即数组最后一个元素),把其指针传给inorder函数
  5. int* nums=(int*)malloc(Maxsize*sizeof(int));
  6. inorder(root,nums,&j);
  7. while(i<j) //循环判断数组中是否存在两数之和等于k的情况
  8. {
  9. if(nums[i]+nums[j]==k) return true;
  10. else if(nums[i]+nums[j]<k) i++;
  11. else j--;
  12. }
  13. return false;
  14. }
  15. void inorder(struct TreeNode* root,int *nums,int* length){ //递归中序遍历二叉搜索树,并且把结果存在数组中
  16. if(root==NULL) return;
  17. inorder(root->left,nums,length);
  18. nums[++(*length)]=root->val;
  19. inorder(root->right,nums,length);
  20. }

运行效率如下所示:


第2题:柠檬水找零

试题要求如下:

回答(C语言):


  
  1. bool lemonadeChange(int*a, int n)
  2. {
  3. if (a == NULL || n <= 0) {
  4. return false;
  5. }
  6. int s5 = 0, s10 = 0, s20 = 0;
  7. for (int i = 0; i < n; i++) {
  8. switch (a[i]) {
  9. case 20: // 给20找15元
  10. if (s10 > 0 && s5 > 0) {
  11. s20++, s10--, s5--;
  12. continue; // 找开了
  13. }
  14. if (s5 > 3) {
  15. s20++, s5 -= 3;
  16. continue; // 找开了
  17. }
  18. return false;
  19. case 10: //给10元找5元
  20. if (s5 > 0) {
  21. s10++, s5--;
  22. continue; // 找开了
  23. }
  24. return false;
  25. case 5: // 给5元
  26. s5++;
  27. continue; // 不找钱
  28. default: // 其他都失败
  29. return false;
  30. }
  31. }
  32. return true;
  33. }

运行效率如下所示:


第3题:左叶子之和

试题要求如下:

回答(C语言):


  
  1. /**
  2. * Definition for a binary tree node.
  3. * struct TreeNode {
  4. * int val;
  5. * struct TreeNode *left;
  6. * struct TreeNode *right;
  7. * };
  8. */
  9. int sumOfLeftLeaves(struct TreeNode* root){
  10. if(!root) return 0;
  11. int sum=0;
  12. if(root->left){
  13. if(!root->left->left&&!root->left->right){
  14. sum+=root->left->val;
  15. }
  16. else{
  17. sum+=sumOfLeftLeaves(root->left);
  18. }
  19. }
  20. if(root->right){
  21. sum+=sumOfLeftLeaves(root->right);
  22. }
  23. return sum;
  24. }

运行效率如下所示:


第4题:第K个缺失的正整数

试题要求如下:

回答(C语言):


  
  1. int findKthPositive(int* arr, int arrSize, int k){
  2. int i = 0, cnt=0, hash[10000] = {0};
  3. for(i=0;i<arrSize;i++)
  4. {
  5. hash[arr[i]]++; //记录出现次数,arr[i]对应下标的hash表值hash[arr[i]]就不会为0
  6. }
  7. for(i=1;i<10000;i++){
  8. if(hash[i]==0){
  9. cnt++;
  10. }
  11. if(cnt==k){ //找到第k个为0的元素,它也就是第k个没有出现的元素,返回对应下标即可
  12. break;
  13. }
  14. }
  15. return i;
  16. }

运行效率如下所示:


第5题:反转字符串2

试题要求如下:

回答(C语言):


  
  1. char * reverseStr(char * s, int k){
  2. //每2k个翻转前k个
  3. //不足2k但大于等于1k,翻转前k个字符剩下的不变
  4. //小于k个字符,全部翻转
  5. int len = strlen(s);
  6. for(int i=0; i<len; i+=2*k){
  7. int left = i;
  8. int right = (i + k - 1 < len) ? i + k - 1 : len - 1;
  9. while(left<right){
  10. char c = s[left];
  11. s[left++] = s[right];
  12. s[right--] = c;
  13. }
  14. }
  15. return s;
  16. }

运行效率如下所示:


第6题:最小移动次数使数组元素相等

试题要求如下:

解题思路:

n - 1个数加1即1个数减1,因此只需算sum(nums) - numsSize * min。

回答(C语言):


  
  1. int minMoves(int* nums, int numsSize){
  2. int ret = 0;
  3. int min = nums[0];
  4. for(int i = 0;i < numsSize;i++){
  5. if(nums[i] < min){
  6. min = nums[i];
  7. }
  8. }
  9. for(int i = 0;i < numsSize;i++){
  10. ret = ret + nums[i] - min;
  11. }
  12. return ret;
  13. }

运行效率如下所示:


第7题:分发饼干

试题要求如下:

解题思路:

采用贪心算法的思路,此问题的贪心选择是“先把胃口最小的孩子满足,再满足之后的,如果当前胃口最小的孩子都没满足那么已经终止分配了”。

回答(C语言):


  
  1. int cmp(const void *a, const void *b) {
  2. return (*(int*)a - *(int*)b);
  3. }
  4. int findContentChildren(int* g, int gSize, int* s, int sSize){
  5. qsort(g, gSize, sizeof(int), cmp);
  6. qsort(s, sSize, sizeof(int), cmp);
  7. int i = 0, j = 0;
  8. int count = 0;
  9. while (i < gSize && j < sSize) {
  10. if (g[i] <= s[j]) {
  11. i++;
  12. count++;
  13. }
  14. j++;
  15. }
  16. return count;
  17. }

运行效率如下所示:


第8题:二叉树的最小深度

试题要求如下:

解题思路:

1、二叉树为空树,最小深度为0;

2、二叉树不为空树,两子树均不为空,获取左右子树的最小深度,取最小的那个加1;

3、二叉树不为空树,但两子树其中之一为空,最小深度为子树不为空的最小深度加1。

回答(C语言):


  
  1. /**
  2. * Definition for a binary tree node.
  3. * struct TreeNode {
  4. * int val;
  5. * struct TreeNode *left;
  6. * struct TreeNode *right;
  7. * };
  8. */
  9. #define min(A, B) ((A) < (B) ? (A) : (B))
  10. int minDepth(struct TreeNode* root){
  11. if (root == NULL) {
  12. return 0;
  13. }
  14. int left = minDepth(root->left);
  15. int right = minDepth(root->right);
  16. return (left && right) ? min(left, right) + 1 : left + right + 1;
  17. }

运行效率如下所示:


第9题:消失的数字

试题要求如下:

回答(C语言):


  
  1. int missingNumber(int* nums, int numsSize){
  2. int sum = 0;
  3. for(int i = 0; i < numsSize; i++){
  4. sum += nums[i];
  5. }
  6. return ((numsSize * (1 + numsSize))/2) - sum;
  7. }

运行效率如下所示:


第10题:多数元素

试题要求如下:

解答思路:

摩尔投票法,通过一个计数变量s,来观察哪一个数最后不是0即为majority;相同加,不相同减,变为0后换下一个。

回答(C语言):


  
  1. int majorityElement(int* nums, int numsSize){
  2. int s = 1;
  3. int maj = nums[0];
  4. for (int i = 1; i < numsSize; i++) {
  5. if (maj == nums[i]){
  6. s++;
  7. }
  8. else {
  9. s--;
  10. }
  11. if (s == 0) {
  12. maj = nums[i + 1];
  13. }
  14. }
  15. return maj;
  16. }

运行效率如下所示:

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

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

(完)