日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

数据结构与算法——搜索

發布時間:2024/7/19 编程问答 33 豆豆
生活随笔 收集整理的這篇文章主要介紹了 数据结构与算法——搜索 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

文章目錄

    • 1.內容概述
    • 2.島嶼數量
      • 2.1 題目描述
      • 2.2 DFS深度搜索算法思路
      • 2.3 BFS寬度搜索算法思路
      • 2.4 C++代碼實現
    • 3.單詞接龍
      • 3.1 題目描述
      • 3.2 算法思路
      • 3.3 C++代碼實現
    • 4.單詞接龍 II
      • 4.1 題目描述
      • 4.2 算法思路
    • 5.火柴拼正方形
      • 5.1 題目描述
      • 5.2 算法思路
      • 5.3 代碼實現
      • 5.4 算法思路2
      • 5.5 代碼實現

1.內容概述

2.島嶼數量

2.1 題目描述

給你一個由 ‘1’(陸地)和 ‘0’(水)組成的的二維網格,請你計算網格中島嶼的數量。

島嶼總是被水包圍,并且每座島嶼只能由水平方向和/或豎直方向上相鄰的陸地連接形成。

此外,你可以假設該網格的四條邊均被水包圍。

示例 1:輸入:grid = [["1","1","1","1","0"],["1","1","0","1","0"],["1","1","0","0","0"],["0","0","0","0","0"] ] 輸出:1示例 2:輸入:grid = [["1","1","0","0","0"],["1","1","0","0","0"],["0","0","1","0","0"],["0","0","0","1","1"] ] 輸出:3

2.2 DFS深度搜索算法思路


#include<iostream> #include<vector> using namespace std;void DFS(vector<vector<int>>& mark, vector<vector<char>>& grid, int x, int y) {mark[x][y] = 1;int dx[] = { -1,1,0,0 };int dy[] = { 0,0,-1,1 };for (int i = 0; i < 4; i++) {int new_x = x + dx[i];int new_y = y + dy[i];if (new_x < 0 || new_y < 0 || new_x >= mark.size() || new_y >= mark[new_x].size()) {continue;}if (mark[new_x][new_y] == 0 && grid[new_x][new_y] == '1') {DFS(mark, grid, new_x, new_y);}} }int main() {vector<vector<char>> grid = { {'1','1','1','0','0'},{'1','1','0','0','0'},{'0','0','1','0','0'},{'0','0','0','1','1'} };vector<vector<int>> mark = { {0,0,0,0,0},{0,0,0,0,0},{0,0,0,0,0},{0,0,0,0,0},};DFS(mark, grid, 1, 1);for (int i = 0 ; i<mark.size(); i++) {for (int j = 0; j < mark[i].size(); j++) {cout << mark[i][j] << " ";}cout << endl;}return 0; } 1 1 1 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0

2.3 BFS寬度搜索算法思路

2.4 C++代碼實現

class Solution { public:void DFS(vector<vector<int>>& mark,vector<vector<char>>& grid,int x,int y){mark[x][y]=1;int dx[]={-1,1,0,0};int dy[]={0,0,-1,1};for(int i=0;i<4;i++){int new_x=x+dx[i];int new_y=y+dy[i];if(new_x<0||new_y<0||new_x>=mark.size()||new_y>=mark[new_x].size()){continue;}if(mark[new_x][new_y]==0&&grid[new_x][new_y]=='1'){DFS(mark,grid,new_x,new_y);}}}void BFS(vector<vector<int>>& mark, vector<vector<char>>& grid, int x, int y) {queue<pair<int, int>> Q;int dx[] = { -1,1,0,0 };int dy[] = { 0,0,-1,1 };Q.push(make_pair(x, y));mark[x][y] = 1;while (!Q.empty()) {x = Q.front().first;y = Q.front().second;Q.pop();for (int i = 0; i < 4; i++) {int new_x = x + dx[i];int new_y = y + dy[i];if (new_x < 0 || new_y < 0 || new_x >= mark.size() || new_y >= mark[new_x].size()) {continue;}if (mark[new_x][new_y] == 0 && grid[new_x][new_y] == '1') {mark[new_x][new_y] = 1;Q.push(make_pair(new_x, new_y));}}}}int numIslands(vector<vector<char>>& grid) {int island=0;vector<vector<int>> mark;for(int i=0;i<grid.size();i++){mark.push_back(vector<int>());for(int j=0;j<grid[i].size();j++){mark[i].push_back(0);}} for(int x=0;x<grid.size();x++){for(int y=0;y<grid[x].size();y++){if(mark[x][y]==0&&grid[x][y]=='1'){DFS(mark,grid,x,y);//或者BFS(mark,grid,x,y);island++;}}} return island;} };

3.單詞接龍

3.1 題目描述

字典 wordList 中從單詞 beginWord 和 endWord 的 轉換序列 是一個按下述規格形成的序列:

序列中第一個單詞是 beginWord 。 序列中最后一個單詞是 endWord 。 每次轉換只能改變一個字母。 轉換過程中的中間單詞必須是字典 wordList 中的單詞。

給你兩個單詞 beginWord 和 endWord 和一個字典 wordList ,找到從 beginWord 到 endWord 的 最短轉換序列 中的 單詞數目 。如果不存在這樣的轉換序列,返回 0。

示例 1:輸入:beginWord = "hit", endWord = "cog", wordList = ["hot","dot","dog","lot","log","cog"] 輸出:5 解釋:一個最短轉換序列是 "hit" -> "hot" -> "dot" -> "dog" -> "cog", 返回它的長度 5。示例 2:輸入:beginWord = "hit", endWord = "cog", wordList = ["hot","dot","dog","lot","log"] 輸出:0 解釋:endWord "cog" 不在字典中,所以無法進行轉換。

3.2 算法思路


bool connect(const string& word1,const string& word2){int cnt=0;for(int i=0;i<word1.length();i++){if(word1[i]!=word2[i]){cnt++;}}return cnt==1;}void construct_graph(string& beginWord,vector<string>& wordList,map<string,vector<string>>& graph){wordList.push_back(beginWord);for(int i=0;i<wordList.size();i++){graph[wordList[i]]=vector<strng>();}for(int i=0;i<wordList.size();i++){for(int j=i+1;j<wordList.size();j++){if(connect(wordList[i]),wordList[j]){graph[wordList[i]].push_back(wordList[j]);graph[wordList[j]].push_back(wordList[i]);}}}}

3.3 C++代碼實現


class Solution { public:bool connect(const string& word1,const string& word2){int cnt=0;for(int i=0;i<word1.length();i++){if(word1[i]!=word2[i]){cnt++;}}return cnt==1;}void construct_graph(string& beginWord,vector<string>& wordList,map<string,vector<string>>& graph){wordList.push_back(beginWord);for(int i=0;i<wordList.size();i++){graph[wordList[i]]=vector<string>();}for(int i=0;i<wordList.size();i++){for(int j=i+1;j<wordList.size();j++){if(connect(wordList[i],wordList[j])){graph[wordList[i]].push_back(wordList[j]);graph[wordList[j]].push_back(wordList[i]);}}}}int BFS_graph(string& beginWord,string& endWord,map<string,vector<string>>& graph){queue<pair<string,int>> Q;set<string> visit;Q.push(make_pair(beginWord,1));visit.insert(beginWord);while(!Q.empty()){string node=Q.front().first;int step=Q.front().second;Q.pop();if(node==endWord){return step;}vector<string> neighbor=graph[node];for(int i=0;i<neighbor.size();i++){if(visit.find(neighbor[i])==visit.end()){Q.push(make_pair(neighbor[i],step+1));visit.insert(neighbor[i]);}}}return 0;}int ladderLength(string beginWord, string endWord, vector<string>& wordList) {map<string,vector<string>> graph;construct_graph(beginWord,wordList,graph);int result=BFS_graph(beginWord,endWord,graph);return result;} };

4.單詞接龍 II

4.1 題目描述

按字典 wordList 完成從單詞 beginWord 到單詞 endWord 轉化,一個表示此過程的 轉換序列 是形式上像 beginWord -> s1 -> s2 -> … -> sk 這樣的單詞序列,并滿足:

每對相鄰的單詞之間僅有單個字母不同。 轉換過程中的每個單詞 si(1 <= i <= k)必須是字典 wordList 中的單詞。 注意,beginWord 不必是字典 wordList 中的單詞。 sk == endWord

給你兩個單詞 beginWord 和 endWord ,以及一個字典 wordList 。請你找出并返回所有從 beginWord 到 endWord 的 最短轉換序列 ,如果不存在這樣的轉換序列,返回一個空列表。每個序列都應該以單詞列表 [beginWord, s1, s2, …, sk] 的形式返回。

示例 1:輸入:beginWord = "hit", endWord = "cog", wordList = ["hot","dot","dog","lot","log","cog"] 輸出:[["hit","hot","dot","dog","cog"],["hit","hot","lot","log","cog"]] 解釋:存在 2 種最短的轉換序列: "hit" -> "hot" -> "dot" -> "dog" -> "cog" "hit" -> "hot" -> "lot" -> "log" -> "cog"示例 2:輸入:beginWord = "hit", endWord = "cog", wordList = ["hot","dot","dog","lot","log"] 輸出:[] 解釋:endWord "cog" 不在字典 wordList 中,所以不存在符合要求的轉換序列。

4.2 算法思路


5.火柴拼正方形

5.1 題目描述

還記得童話《賣火柴的小女孩》嗎?現在,你知道小女孩有多少根火柴,請找出一種能使用所有火柴拼成一個正方形的方法。不能折斷火柴,可以把火柴連接起來,并且每根火柴都要用到。

輸入為小女孩擁有火柴的數目,每根火柴用其長度表示。輸出即為是否能用所有的火柴拼成正方形。

示例 1:輸入: [1,1,2,2,2] 輸出: true解釋: 能拼成一個邊長為2的正方形,每邊兩根火柴。示例 2:輸入: [3,3,3,3,4] 輸出: false解釋: 不能用所有火柴拼成一個正方形。

5.2 算法思路

5.3 代碼實現

class Solution { public:bool makesquare(vector<int>& matchsticks) {if(matchsticks.size()<4){return false;}int sum=0;for(int i=0;i<matchsticks.size();i++){sum+=matchsticks[i];}if(sum%4){return false;}sort(matchsticks.rbegin(),matchsticks.rend());int bucket[4]={0};return generate(0,matchsticks,sum/4,bucket);} private:bool generate(int i,vector<int>& matchsticks,int target,int bucket[]){if(i>=matchsticks.size()){return bucket[0]==target&&bucket[1]==target&&bucket[2]==target&&bucket[3]==target;}for(int j=0;j<4;j++){if(bucket[j]+matchsticks[i]>target){continue;}bucket[j]+=matchsticks[i];if(generate(i+1,matchsticks,target,bucket)){return true;}bucket[j]-=matchsticks[i];}return false;} };

5.4 算法思路2

5.5 代碼實現

class Solution { public:bool makesquare(vector<int>& matchsticks){if(matchsticks.size()<4){return false;}int sum=0;for(int i=0;i<matchsticks.size();i++){sum+=matchsticks[i];}if(sum%4){return false;}int target=sum/4;vector<int> ok_subset;vector<int> ok_half;int all=1<<matchsticks.size();for(int i=0;i<all;i++){int sum=0;for(int j=0;j<matchsticks.size();j++){if(i&(1<<j)){sum+=matchsticks[j];}}if(sum==target){ok_subset.push_back(i);}}for(int i=0;i<ok_subset.size();i++){for(int j=i+1;j<ok_subset.size();j++){if((ok_subset[i]&ok_subset[j])==0){ok_half.push_back(ok_subset[i]|ok_subset[j]);}}}for(int i=0;i<ok_half.size();i++){for(int j=i+1;j<ok_half.size();j++){if((ok_half[i]&ok_half[j])==0){return true;}}}return false;} }

總結

以上是生活随笔為你收集整理的数据结构与算法——搜索的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。