/**
* Note: The returned array must be malloced, assume caller calls free().
*/
int* rowAndMaximumOnes(int** mat, int matSize, int* matColSize, int* returnSize){
int* arr = (int*)malloc(sizeof(int)*2);
*returnSize = 2;
arr[0] = 0;arr[1] = 0;
for(int i=0;i<matSize;i++){
int count = 0;
for(int j=0;j<*matColSize;j++){
if(mat[i][j] == 1) count++;
}
if(count > arr[1]){
arr[0] = i;
arr[1] = count;
}
}
return arr;
}
int dp[210][210];// 记录从未知点出发到当前位置所能得到的最长递增路径
//规定方向
int dir[4][2] = {
// y x
//上 右 下 左
{-1,0},{0,1},{1,0},{0,-1}
};
//深度优先搜索
int dfs(int y,int x,int** matrix,int r,int c){
int i,ret = 1;
for(i=0;i<4;i++){
int dest_x = x+dir[i][1];
int dest_y = y+dir[i][0];
if(dest_x < 0 || dest_x >= c || dest_y < 0 || dest_y >= r) continue;
if(matrix[dest_y][dest_x] < matrix[y][x]){
if(dp[dest_y][dest_x] == -1){
dp[dest_y][dest_x] = dfs(dest_y,dest_x,matrix,r,c);
}
if(dp[dest_y][dest_x] + 1 > ret){
ret = dp[dest_y][dest_x] + 1;
}
}
}
return ret;
}
int longestIncreasingPath(int** matrix, int matrixSize, int* matrixColSize){
int r = matrixSize;
int c = matrixColSize[0];
int i,j,max=0;
memset(dp,-1,sizeof(dp));
for(i=0;i<r;i++){
for(j=0;j<c;j++){
if(dp[i][j]=-1){
dp[i][j] = dfs(i,j,matrix,r,c);
}
if(dp[i][j]>max){
max = dp[i][j];
}
}
}
return max;
}
//深度优先搜索
int dfs(int cur,int next ,int k, int** relation,int r, int n){
if(k == 0 ){
if(next == n-1) return 1;
else return 0;
}
int ans=0;
for(int i=0;i<r;i++){
if(relation[i][0] == next){
ans+=dfs(relation[i][0],relation[i][1],k-1,relation,r,n);
}
}
return ans;
}
int numWays(int n, int** relation, int relationSize, int* relationColSize, int k){
int r = relationSize;
int c = relationColSize[0];
//从编号0出发
int ans = 0;
for(int i=0;i<r;i++){
int cur = relation[i][0];
int next = relation[i][1];
if(cur == 0){ // 从0开始的结点进入递归
ans += dfs(cur,next,k-1,relation,r,n);
}
}
return ans;
}
int firstMissingPositive(int* nums, int numsSize){
int arr[numsSize+1];
memset(arr,-1,sizeof(arr));
for(int i=0;i<numsSize;i++){
// 如果当前数在范围内
if(nums[i]>0 && nums[i]<numsSize+1) {
arr[nums[i]] = 1;
}
}
for(int i=1;i<numsSize+1;i++){
if(arr[i]!=1){
return i;
}
}
return numsSize+1;
}
int firstUniqChar(char * s){
int Hash[26];
memset(Hash,0,sizeof(Hash));
for(int i=0;s[i];i++){
Hash[s[i]-'a']++;
}
for(int i=0;s[i];i++){
if(Hash[s[i]-'a'] == 1) return i;
}
return -1;
}