• 241.为运算表达式设计优先级


    题目

    给你一个由数字和运算符组成的字符串 expression ,按不同优先级组合数字和运算符,计算并返回所有可能组合的结果。你可以 按任意顺序 返回答案。

    生成的测试用例满足其对应输出值符合 32 位整数范围,不同结果的数量不超过 104 。

    来源:力扣(LeetCode)
    链接:https://leetcode.cn/problems/different-ways-to-add-parentheses
    著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

    示例

     

    思路

    题目要求按不同优先级组合数字和运算符,计算并返回所有可能组合的结果。

    对于一个形如 x op y(op 为运算符,x 和 y 为数) 的算式而言,它的结果组合取决于 x 和 y 的结果组合数,而 x 和 y 又可以写成形如 x op y 的算式。

    因此,该问题的子问题就是 x op y 中的 x 和 y:以运算符分隔的左右两侧算式解。

    然后我们来进行 分治算法三步走:

    分解:按运算符分成左右两部分,分别求解

    解决:实现一个递归函数,输入算式,返回算式解

    合并:根据运算符合并左右两部分的解,得出最终解

    每一个问题都可以分为两个子问题,而每个子问题又可以分为两个子问题,并且问题与子问题之间的求解思路都是一样的

    代码

    1. int* diffWaysToCompute(char * input, int* returnSize){
    2. if(input == NULL){
    3. *returnSize = 0;
    4. return NULL;
    5. }
    6. int len = strlen(input);
    7. char *lstr = (char *)calloc(len, sizeof(char));
    8. char *rstr = (char *)calloc(len, sizeof(char));
    9. int mid = 0;
    10. int retcnt = 0;
    11. int calflag = 0;
    12. int *ret = (int *)calloc(1, sizeof(int));
    13. while(mid < len){
    14. if(input[mid] >= '0' && input[mid] <= '9'){
    15. mid++;
    16. continue;
    17. }
    18. calflag = 1;
    19. memcpy(lstr, input, mid);
    20. lstr[mid] = '\0';
    21. memcpy(rstr, input+mid+1, len-mid-1);
    22. rstr[len-mid-1] = '\0';
    23. int lsize = 0;
    24. int rsize = 0;
    25. int *lret = diffWaysToCompute(lstr, &lsize);
    26. int *rret = diffWaysToCompute(rstr, &rsize);
    27. int *retmp = (int *)realloc(ret, (retcnt+lsize*rsize)*sizeof(int));
    28. if(retmp == NULL){
    29. return NULL;
    30. }
    31. ret = retmp;
    32. for(int i = 0; i < lsize; i++){
    33. for(int j = 0; j < rsize; j++){
    34. switch(input[mid]){
    35. case '+':
    36. ret[retcnt++] = lret[i]+rret[j];
    37. break;
    38. case '-':
    39. ret[retcnt++] = lret[i]-rret[j];
    40. break;
    41. case '*':
    42. ret[retcnt++] = lret[i]*rret[j];
    43. break;
    44. default:
    45. break;
    46. }
    47. }
    48. }
    49. mid++;
    50. }
    51. if(calflag == 0){
    52. *returnSize = 1;
    53. ret[0] = atoi(input);
    54. return ret;
    55. }
    56. *returnSize = retcnt;
    57. return ret;
    58. }

    时间空间复杂度

     

  • 相关阅读:
    redis 队列
    腾讯智影数字人工具
    还在寻找PDF压缩方法?这个方法值得一试
    tracker-sotre CPU占用率过高
    springboot+vue+Elementui家族宗族信息门户网
    调试 webview 通知Notification
    经纬高到北东天的坐标相互转换matlab
    理解控制反转
    MySQL数据库分库分表
    【强连通+背包】CF1763E
  • 原文地址:https://blog.csdn.net/m0_64560763/article/details/125556822