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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

力扣打开转盘锁

發布時間:2023/12/1 编程问答 46 豆豆
生活随笔 收集整理的這篇文章主要介紹了 力扣打开转盘锁 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

打開轉盤鎖
評論區大神代碼:

public int openLock(String[] deadends, String target) {Set<String> set = new HashSet<>(Arrays.asList(deadends));//開始遍歷的字符串是"0000",相當于根節點String startStr = "0000";if (set.contains(startStr))return -1;//創建隊列Queue<String> queue = new LinkedList<>();//記錄訪問過的節點Set<String> visited = new HashSet<>();queue.offer(startStr);visited.add(startStr);//樹的層數int level = 0;while (!queue.isEmpty()) {//每層的子節點個數int size = queue.size();while (size-- > 0) {//每個節點的值String str = queue.poll();//對于每個節點中的4個數字分別進行加1和減1,相當于創建8個子節點,這八個子節點//可以類比二叉樹的左右子節點for (int i = 0; i < 4; i++) {char ch = str.charAt(i);//strAdd表示加1的結果,strSub表示減1的結果String strAdd = str.substring(0, i) + (ch == '9' ? 0 : ch - '0' + 1) + str.substring(i + 1);String strSub = str.substring(0, i) + (ch == '0' ? 9 : ch - '0' - 1) + str.substring(i + 1);//如果找到直接返回if (str.equals(target))return level;//不能包含死亡數字也不能包含訪問過的字符串if (!visited.contains(strAdd) && !set.contains(strAdd)) {queue.offer(strAdd);visited.add(strAdd);}if (!visited.contains(strSub) && !set.contains(strSub)) {queue.offer(strSub);visited.add(strSub);}}}//當前層訪問完了,到下一層,層數要加1level++;}return -1;}作者:數據結構和算法 鏈接:https://leetcode-cn.com/leetbook/read/queue-stack/kj48j/?discussion=5WQchG 來源:力扣(LeetCode) 著作權歸作者所有。商業轉載請聯系作者獲得授權,非商業轉載請注明出處。

我仿寫了一遍,有個地方如果按我寫的會超時,但是絕對是正確的,拿出來求網友解答,或者自己日后找到答案了就來解答:

class Solution {public int openLock(String[] deadends, String target) {Set<String> set = new HashSet<String>(Arrays.asList(deadends));String startStr = "0000";if(target.equals(startStr)){return 0;}if(set.contains(startStr)){return -1;}Queue<String> queue = new LinkedList<>();Set<String> visited = new HashSet<>();queue.offer(startStr);visited.add(startStr);int level = 0;while(!queue.isEmpty()){int size = queue.size();while(size-->0){String str = queue.poll();if(str.equals(target)){return level;} for(int i = 0;i<4;i++){char ch = str.charAt(i);String strAdd = str.substring(0,i)+(ch=='9'?0:ch-'0'+1)+str.substring(i+1);String strSub = str.substring(0,i)+(ch=='0'?9:ch-'0'-1)+str.substring(i+1);if(!visited.contains(strAdd)&&!set.contains(strAdd)){visited.add(strAdd);queue.offer(strAdd);}if(!visited.contains(strSub)&&!set.contains(strSub)){visited.add(strSub);queue.offer(strSub);}}}level++;}return -1;} }

其中

String strAdd = str.substring(0,i)+(ch=='9'?0:ch-'0'+1)+str.substring(i+1); String strSub = str.substring(0,i)+(ch=='0'?9:ch-'0'-1)+str.substring(i+1);

若寫成我的想法就會超時:

String strAdd = str.substring(0,i)+(ch=='9'?'0':ch+1)+str.substring(i+1); String strSub = str.substring(0,i)+(ch=='0'?'9':ch-1)+str.substring(i+1);

哪里效率變低了呢?

總結

以上是生活随笔為你收集整理的力扣打开转盘锁的全部內容,希望文章能夠幫你解決所遇到的問題。

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