Leecode-74-搜索二维矩阵
题目
给你一个满足下述两条属性的 m x n 整数矩阵:
每行中的整数从左到右按非严格递增顺序排列。
每行的第一个整数大于前一行的最后一个整数。
给你一个整数 target ,如果 target 在矩阵中,返回 true ;否则,返回 false 。
示例
示例1
输入:matrix = [[1,3,5,7],[10,11,16,20],[23,30,34,60]], target = 3
输出:true
示例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 = “()()”
输出:“”
解释:
输入字符串为 “()()”,原语化分解得到 “()” + “()”,
删除每个部分中的最外层括号后得到 “” + “” = “”。
解题思路
- 计算输入字符串s的长度
- 为结果字符串res分配内存
- 为栈stk分配内存,预期存储左括号(
- 遍历输入字符串s的每个字符
如果遇到),则栈顶指针top减1
如果栈不为空(即top > 0),则将当前字符c添加到结果字符串res中
如果遇到(,则将其压入栈stk - 释放栈stk的内存
- 在结果字符串res的末尾添加空字符\0,表示字符串的结束
- 返回结果字符串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;
}