200. 岛屿数量/221. 最大正方形/93. 复原IP地址

200. 岛屿数量

  • 相关标签: BFS DFS 并查集
// 这题就是个 图染色的问题 dfs 递归写吧 


void dfs(char **grid, int gridSize, int* gridColSize, int i, int j, int **visited)
{
    if (i < 0 || i >=gridSize || j < 0 || j >=  *gridColSize || visited[i][j] == 1 || grid[i][j] != '1') {
        return;
    }
    // 1. 标记为 visited 
    if (visited[i][j] == 0) {
        visited[i][j] = 1;
    }
    
    dfs(grid, gridSize, gridColSize, i - 1, j, visited);
    
    dfs(grid, gridSize, gridColSize, i + 1, j, visited);
    
    dfs(grid, gridSize, gridColSize, i, j - 1, visited);
    
    dfs(grid, gridSize, gridColSize, i, j + 1, visited);
    
    return ;
    
}

int numIslands(char** grid, int gridSize, int* gridColSize){
    if (grid == NULL || gridSize == 0 || gridColSize == NULL || *gridColSize == 0) {
        return 0;
    }

    int **visited = (int **)malloc(sizeof(int *) * gridSize);
    for (int i = 0; i < gridSize; i++) {
        visited[i] = (int *)malloc(sizeof(int) * (*gridColSize));
        memset(visited[i], 0, sizeof(int) * (*gridColSize));
    }

    int landNum = 0; 
    for (int i = 0; i < gridSize; i++) {
        for (int j =0; j < *gridColSize; j++) {
            if (grid[i][j] == '1' && visited[i][j] == 0) { //遍历数据 遇到1 就进去染色
                dfs(grid, gridSize, gridColSize, i, j, visited);
                landNum++;
            }
        }
    } 
    
//     for (int i = 0; i < gridSize; i++) {
//         for (int j =0; j < *gridColSize; j++) { 
//             printf("%d -", visited[i][j]);

//         } 
//         printf("\n");
//     }

    for (int i = 0; i < gridSize; i++) {
        free(visited[i]);
    }
    free(visited);
    return landNum;
}


221. 最大正方形

  • 相关标签 : 动态规划

/*
思路: 


1. 暴力 

for (i...m) 
    for (j...n)
        i,j 为 左上的 所有 边长的情况 

eg : 
0,0 为 i,j 
    00-11, 00-22, 00-33 每次都要遍历 n*n  
    
    有很多重叠的地方 重复遍历 
    
    有可能是DP 
    
DP : DP[i][j] 表示什么? 表示 从0,0 到 i,j 的 最大正方形 的 最大边长 

dp[i][j] = if 当前 是 0  , 那么 00 - ij 就不可能是正方形 , 最大边长为0  dp[i][j] == 0
            else : 看一下 上面 左边 和左上 最小的边长  , 加上自身的 1  得到 当前的最大边长

*/



int lMin(int a, int b, int c) {
    int temp  = (a < b) ? a : b;
    return temp < c ? temp : c;
}


int maximalSquare(char** matrix, int matrixSize, int* matrixColSize){
    if( matrix == NULL || matrixSize ==0 || matrixColSize == NULL || *matrixColSize == 0) {
        return 0;
    }
    
    int **dp = (int **)malloc(sizeof(int *) * (matrixSize + 1));
    for (int i = 0; i < matrixSize + 1; i++) {
        dp[i] = (int *)malloc(sizeof(int) * (*matrixColSize + 1));
        memset(dp[i], 0, sizeof(int) * (*matrixColSize + 1));
    }
        
    int res = 0;
    
    for (int i = 0; i < matrixSize; i++) {
        for (int j =0; j < *matrixColSize; j++) {
            dp[i + 1][j + 1] =  (matrix[i][j] == '0') ? 0 : (lMin(dp[i][j], dp[i+1][j], dp[i][j+1]) + 1);
            if (dp[i + 1][j + 1] > res) {
                res = dp[i + 1][j + 1];
            }
        }
    }
    

    
    for (int i = 0; i < matrixSize + 1; i++) {
        free(dp[i]);
    }
    free(dp);
    return res * res;

}


93. 复原IP地址

  • 相关标签 : 字符串, 回溯算法
#define BUFLEN 10000
#define STRLEN 100
void helper(char **resArr, char *s, char *curIp, int curIdx, int index, int remain, int *returnSize)
{
    if (remain == 0) {
        if (index == strlen(s)) {
            resArr[*returnSize] = (char *)malloc(STRLEN);
            memset(resArr[*returnSize], 0 , STRLEN);
            memcpy(resArr[*returnSize], curIp, STRLEN);
            (*returnSize)++;
        }
        return;
    }
    int curVal = 0;
    char subStr[4] = {0};
    for (int i = 1; i <= 3; i++) {
        memcpy(subStr, s + index, i);
        // 首位为0 , 只可能是0 
        if (subStr[0] == '0' && i > 1) {
            continue;
        }
        curVal = strtol(subStr, (char **)NULL, 10);
        if (curVal >= 0 && curVal <= 255) {
            if (remain == 1) {
                sprintf(curIp + curIdx, "%d", curVal);
            } else {
                sprintf(curIp + curIdx, "%d.", curVal);
            }
            helper(resArr, s, curIp, curIdx + strlen(subStr) + 1, index + i, remain - 1, returnSize);
        }
    }
    return;
}
/**
 * Note: The returned array must be malloced, assume caller calls free().
 */
char ** restoreIpAddresses(char * s, int* returnSize){
    *returnSize = 0;
    if (s == NULL || strlen(s) < 4) {
        return NULL;
    }
    char **resArr = (char **)malloc(sizeof(char *) * BUFLEN);
    if (resArr == NULL) {
        return NULL;
    }
    memset(resArr, 0, sizeof(char *) * BUFLEN);

    char *curIp = (char *)malloc(STRLEN);
    if (curIp == NULL) {
        return NULL;
    }
    memset(curIp, 0, STRLEN);
    
    helper(resArr, s, curIp, 0, 0, 4, returnSize);
    
    free(curIp);
    printf("%d\n", *returnSize);
    return resArr;
}
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 213,711评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,079评论 3 387
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 159,194评论 0 349
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,089评论 1 286
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,197评论 6 385
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,306评论 1 292
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,338评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,119评论 0 269
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,541评论 1 306
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,846评论 2 328
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,014评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,694评论 4 337
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,322评论 3 318
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,026评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,257评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,863评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,895评论 2 351

推荐阅读更多精彩内容