每日一题(4.21)

Leecode-74-搜索二维矩阵

题目

给你一个满足下述两条属性的 m x n 整数矩阵:

每行中的整数从左到右按非严格递增顺序排列。
每行的第一个整数大于前一行的最后一个整数。
给你一个整数 target ,如果 target 在矩阵中,返回 true ;否则,返回 false 。

示例

示例1
示例1

输入:matrix = [[1,3,5,7],[10,11,16,20],[23,30,34,60]], target = 3
输出:true

示例2
示例2

输入:matrix = [[1,3,5,7],[10,11,16,20],[23,30,34,60]], target = 13
输出:false

解题思路

代码实现

int Search(int* nums, int indexLeft,int indexRight, int target)
{
    int mid;
    while (indexLeft <= indexRight)
    {
        mid = (indexRight - indexLeft) / 2 + indexLeft;
        if (nums[mid] == target)
        {
            return mid;
        }
        else if (nums[mid] > target)
        {
            indexRight = mid - 1;
        }
        else
        {
            indexLeft = mid + 1;
        }
    }
    return -1;
}

bool searchMatrix(int** matrix, int matrixSize, int* matrixColSize, int target)
{
   int *new = (int *) malloc(sizeof(int) *matrixSize *matrixColSize[0]);
   int n,m;
   int cnt = 0;
   for(n = 0 ; n < matrixSize; n++)
   {
       for(m = 0 ; m < matrixColSize[0]; m++)
       {
          new[cnt] =  matrix[n][m];
          cnt++;
       }
   }
    if(Search(new,0,cnt-1,target) != -1)
    {
        return true;
    }
    return false;


}

Leecode-1021-删除最外层的括号

题目

有效括号字符串为空 “”、“(” + A + “)” 或 A + B ,其中 A 和 B 都是有效的括号字符串,+ 代表字符串的连接。

例如,“”,“()”,“(())()” 和 “(()(()))” 都是有效的括号字符串。
如果有效字符串 s 非空,且不存在将其拆分为 s = A + B 的方法,我们称其为原语(primitive),其中 A 和 B 都是非空有效括号字符串。

给出一个非空有效字符串 s,考虑将其进行原语化分解,使得:s = P_1 + P_2 + … + P_k,其中 P_i 是有效括号字符串原语。

对 s 进行原语化分解,删除分解中每个原语字符串的最外层括号,返回 s 。

示例

示例1

输入:s = “(()())(())”
输出:“()()()”
解释:
输入字符串为 “(()())(())”,原语化分解得到 “(()())” + “(())”,
删除每个部分中的最外层括号后得到 “()()” + “()” = “()()()”。

示例2

输入:s = “(()())(())(()(()))”
输出:“()()()()(())”
解释:
输入字符串为 “(()())(())(()(()))”,原语化分解得到 “(()())” + “(())” + “(()(()))”,
删除每个部分中的最外层括号后得到 “()()” + “()” + “()(())” = “()()()()(())”。

示例3

输入:s = “()()”
输出:“”
解释:
输入字符串为 “()()”,原语化分解得到 “()” + “()”,
删除每个部分中的最外层括号后得到 “” + “” = “”。

解题思路

  1. 计算输入字符串s的长度
  2. 为结果字符串res分配内存
  3. 为栈stk分配内存,预期存储左括号(
  4. 遍历输入字符串s的每个字符
    如果遇到),则栈顶指针top减1
    如果栈不为空(即top > 0),则将当前字符c添加到结果字符串res中
    如果遇到(,则将其压入栈stk
  5. 释放栈stk的内存
  6. 在结果字符串res的末尾添加空字符\0,表示字符串的结束
  7. 返回结果字符串res

代码实现

char * removeOuterParentheses(char * s) {
    int len = strlen(s);
    char *res = (char *)malloc(sizeof(char) * len);
    char *stk = (char *)malloc(sizeof(char) * (len / 2));
    int index = 0, top = 0;
    for (int i = 0; i < len; i++) {
        char c = s[i];
        if (c == ')') {
            top--;
        }
        if (top > 0) {
            res[index++] = c;
        }
        if (c == '(') {
            stk[top++] = c;
        }
    }
    free(stk);
    res[index] = '\0';
    return res;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值