算法分析(含答案)笔试题 (6)

不重复集合求子集
解答采用的是深度优先遍历,先取原数组一个元素,再构造包括这个元素的两个,
三个……n 个元素的集合。dfs 中的 start 就指向这个元素的,它在不断地后移
(i+1)。

@param S: A set of numbers.

@return: A list of lists. All valid subsets.
*/
public class Solution1 {
public static void main(String[] args) {
int[] first = new int[]{1, 2, 3};
ArrayList<ArrayList> res = subsets(first);
for(int i = 0; i < res.size(); i ++){
System.out.println(res.get(i));
}
}
public static ArrayList<ArrayList> subsets(int[]
nums) {
ArrayList<ArrayList> res = new
ArrayList<ArrayList>();
ArrayList item = new ArrayList();
if(nums.length == 0 || nums == null)
return res;
Arrays.sort(nums); //排序
dfs(nums, 0, item, res); //递归调用
res.add(new ArrayList()); //最后加上一个空集
return res;
}
public static void dfs(int[] nums, int start,
ArrayListitem, ArrayList<ArrayList>res){
for(int i = start; i < nums.length; i ++){
item.add(nums[i]);
//item 是以整数为元素的动态数组,而 res 是以数组为元素的数
组,在这一步,当 item 增加完元素后,item 所有元素构成一个完整的子串,
再由 res 纳入
res.add(new ArrayList(item));
dfs(nums, i + 1, item, res);
item.remove(item.size() - 1);
}
} }

迭代方法实现二叉树的先序遍历:题目: 给定一颗⼆叉树,返回节点值
得先序遍历,请使用迭代(非递归)方式实现。
比如, 给定二叉树{1,#,2,3}, 返回 [1,2,3]
/**
Definition for a binary tree node.
public class TreeNode {
int val;
TreeNode left;
TreeNode right;
TreeNode(int x) { val = x; }

}
*/
public class Solution {

List result = new ArrayList();

/**

迭代实现,维护一个栈,因为入栈顺序按照根右左进行入栈,因此首先
将根出栈,然后出栈左子节点,

最后出栈右子节点。

@param root

@return
*/
public List preorderTraversal(TreeNode root) {
if(root == null)
return result;
Stack stack = new Stack();
stack.push(root);
while(!stack.isEmpty()) {
TreeNode node = stack.pop();
result.add(node.val);
if(node.right != null)
stack.push(node.right);
if(node.left != null)
stack.push(node.left);
}
return result;
}
}

验证二叉搜索树 BST:题目: 验证一棵树是否为有效的二叉搜索树 BST
比如,二叉树[2, 1, 3],返回 true 二叉树[1, 2, 3], 返回 false
class TreeNode {
int val;
TreeNode left;
TreeNode right;
TreeNode(int x) { val = x; }
}
public class BSTChecker {
private static int lastVisit = Integer.MIN_VALUE;

public static boolean isBST(TreeNode root) {
if(root == null) return true;

boolean judgeLeft = isBST(root.left); // 先判断左子树

if(root.val >= lastVisit && judgeLeft) { // 当前节点比上
次访问的数值要大
lastVisit = root.val;
} else {
return false;
}

boolean judgeRight = isBST(root.right); // 后判断右子树

return judgeRight;
}
}
649. 编辑距离题目: 给定两个单词 word1 和 word2,找到最小的操作步骤
使得 word1 转换成 word2,每次操作算作一 步。你可以对单词进行以下
三种操作:1)插入一个字符 2)删除一个字符 3)替换一个字符
参考地址:
650. 买卖股票问题:题目: 你有一个数组,第 i 个元素表示第 i 天某个股票
的价格,设计一个算法找到最大的利润,并且你只能最多完成两次交易。
参考地址:没有完全理解的


/**

解题思路:

比如给定一组数组,[1,2,3,6,9,3,10]

最多可以 2 次去获取最大的利益,可以用 2 分的思想,分成 2 部分,

从 0 元素开始遍历分别求出左右 2 边的最大利益,求出的左右 2 边最大的利
益即为解
*/
class Solution {
public static int maxProfit(int[] prices) {
// write your code here
if(nullprices||0prices.length) return 0;
int sumProfit = 0;
for(int i=1;i<prices.length;i++){
int tmpsum = maxProfit(prices, 0, i)

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/zgfxsw.html