您的位置:首页 > 游戏 > 游戏 > 求职leetcode题目(10)

求职leetcode题目(10)

2024/10/6 6:43:29 来源:https://blog.csdn.net/2302_79993788/article/details/141870471  浏览:    关键词:求职leetcode题目(10)

1.复原ip地址

解题过程:  

分析剪枝条件(下面只写出一些我想到的要点,有些点能想到,但是编码很复杂,我就没有写了):

  • 1、一开始,字符串的长度小于 4 或者大于 12 ,一定不能拼凑出合法的 ip 地址(这一点可以一般化到中间结点的判断中,以产生剪枝行为);
  • 2、每一个结点可以选择截取的方法只有 3 种:截 1 位、截 2 位、截 3 位,因此每一个结点可以生长出的分支最多只有 3 条分支;根据截取出来的字符串判断是否是合理的 ip 段,这里写法比较多,可以先截取,再转换成 int ,再判断。我采用的做法是先转成 int,是合法的 ip 段数值以后,再截取。
  • 3、由于 ip 段最多就 4 个段,因此这棵三叉树最多 4 层,这个条件作为递归终止条件之一;
class Solution {//画图理解public List<String> restoreIpAddresses(String s) {//定义表示一个字符长度的变量int len = s.length();//定义一个返回结果的集合List<String> res = new ArrayList<>();//如果当前字符长度大于12或者小于4都不满足if(len > 12 || len <4){return res;}//定义一个保存路径上的变量Deque<String> path = new ArrayDeque<>();//深度优先搜索dfs(s,len, 0, 4, path, res);//返回结果return res;}public void dfs(String s, int len, int begin, int residue, Deque<String> path, List<String> res){//如果字符串已经遍历到最后了,并且已经切分为4段了,//就把当前路径上的元素加入到返回的结果集中if(begin == len){if(residue ==0){res.add(String.join(".", path));}return;}//begin表示遍历字符串从哪里开始for(int i = begin; i < begin+3; i++){//如果超出字符串的长度,就直接退出//begin,每次选择都是从之前选择的元素的下一个元素开始,if(i >= len){break;}//如果剩余元素大于ip最多能容纳的个数,就剪枝。if(len -i > residue * 3){continue;}//判断当前截取字符是否是小于0或者大于255//这里的begin和i,代表的是,这时候截取了几个字符//begin从哪里开始,i到哪里结束if(judgeIpSegment(s, begin, i)){//保留当前截取字符String currentIpSegment = s.substring(begin, i+1);//将当前路径上的元素加入到路径队列中path.addLast(currentIpSegment);//递归下一层dfs(s, len, i+1,residue -1, path, res);//剪枝path.removeLast();}}}private boolean judgeIpSegment(String s, int left, int right){//定义一个表示整个字符的长度int len = right - left +1;//如果截取的大于等于2的字符的开头为0,就直接falseif(len > 1 && s.charAt(left) == '0'){return false;}//定义返回结果的集合int res = 0;//拼接字符while(left <= right){//res*10 是为了将先加的字符默认比后面的字符大10倍,也就是位数是从小到大res = res * 10 + s.charAt(left) - '0';left++;}return res >= 0 && res <= 255;}
}

2.杨辉三角 

解题思路:

我们只需要一层一层的求。但是不需要把每一层的结果都保存起来,只需要保存上一层的结果,就可以求出当前层的结果了

class Solution {public List<Integer> getRow(int rowIndex) {List<Integer> pre = new ArrayList<Integer>();for (int i = 0; i <= rowIndex; ++i) {List<Integer> cur = new ArrayList<Integer>();for (int j = 0; j <= i; ++j) {if (j == 0 || j == i) {cur.add(1);} else {cur.add(pre.get(j - 1) + pre.get(j));}}pre = cur;}return pre;}
}

 效率还是一般般

我们可以只使用一个一个数组来降低内存

  • 这不就是下一行的某一元素是上一行的对应位置元素和前一位置元素之和么(位置为0的元素一直为1特殊处理)
  • 这就简单了,首先初始化一个list并添加一个元素1,求下一个元素的时候先向list末尾添加一个0,然后求某位置元素等于上一行对应位置和前一位置元素之和。
class Solution {public List<Integer> getRow(int rowIndex) {List<Integer> row = new ArrayList<Integer>();row.add(1);for (int i = 1; i <= rowIndex; ++i) {row.add(0);for (int j = i; j > 0; --j) {row.set(j, row.get(j) + row.get(j - 1));}}return row;}
}

3.路径求和 

 解题思路:

思路及算法

观察要求我们完成的函数,我们可以归纳出它的功能:询问是否存在从当前节点 root 到叶子节点的路径,满足其路径和为 sum。

假定从根节点到当前节点的值之和为 val,我们可以将这个大问题转化为一个小问题:是否存在从当前节点的子节点到叶子的路径,满足其路径和为 sum - val。

不难发现这满足递归的性质,若当前节点就是叶子节点,那么我们直接判断 sum 是否等于 val 即可(因为路径和已经确定,就是当前节点的值,我们只需要判断该路径和是否满足条件)。若当前节点不是叶子节点,我们只需要递归地询问它的子节点是否能满足条件即可。

class Solution {public boolean hasPathSum(TreeNode root, int sum) {if(root==null){return false;}if(root.left==null&&root.right==null){return sum =root.val;}return hasPathSum(root.left,sum-root.val)||hasPathSum(root.right,sum-root.val);}
}

第二种方法:

使用广度优先搜索

记录从根节点到当前节点的路径和,以防止重复计算。

这样我们使用两个队列,分别存储将要遍历的节点,以及根节点到这些节点的路径和即可。

 

class Solution {public boolean hasPathSum(TreeNode root, int sum) {if (root == null) {return false;}Queue<TreeNode> queNode = new LinkedList<TreeNode>();Queue<Integer> queVal = new LinkedList<Integer>();queNode.offer(root);queVal.offer(root.val);while (!queNode.isEmpty()) {TreeNode now = queNode.poll();int temp = queVal.poll();if (now.left == null && now.right == null) {if (temp == sum) {return true;}}if (now.left != null) {queNode.offer(now.left);queVal.offer(now.left.val + temp);}if (now.right != null) {queNode.offer(now.right);queVal.offer(now.right.val + temp);}}return false;}
}

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com