11.22
384. 打乱数组

- 对于reset操作,用一个数组保存nums原始的值,需要时返回即可
- 对于shuffle操作,采用洗牌算法:即对nums[i],将其和nums[i]-nums[n-1-i]中的的元素随机交换
下标为i的元素,和区间[i,n-1-i]内的元素随机交换
class Solution {int initArr[];int nums[];public Solution(int[] nums) {initArr=new int[nums.length];for(int i=0;i<nums.length;i++)initArr[i]=nums[i];this.nums=nums;}public int[] reset() {return initArr;}public int[] shuffle() {Random random=new Random();for(int i=0;i<nums.length;i++){//random.nextInt(n-i)--->[0,n-i) 即[0,n-i-1]//[0,n-i-1]+i=[i,n-1]swap(i,i+random.nextInt(nums.length-i));}return nums;}public void swap(int i,int j){int t=nums[i];nums[i]=nums[j];nums[j]=t;}}//O(n)//O(n)
11.23
859. 亲密字符串

- 当两个字符串长度不同时,返回false
- 记录两个字符串中各个字符出现的次数,某种字符出现的次数如果不同,返回false
- 记录s核goal中同一个位置上字符不同的个数为diff, 如果diff==2,返回false; 如果diff=0但是如果某类字符出现了两次及以上,这种情况也返回true, 比如aa aa | abab abab | aba aba|
class Solution {public:bool buddyStrings(string s, string goal) {if(s.size()!=goal.size())return false;unordered_map<char,int> map1,map2;for(char c:s)map1[c]++;for(char c:goal)map2[c]++;int diff=0;bool flag=false;for(int i=0;i<s.size();i++){if(map1[s[i]]!=map2[s[i]])return false;if(s[i]!=goal[i])diff++;if(map1[s[i]]>1)flag=true;}return diff==2||(diff==0&&flag);}};//O(m+n) m n分别为s和goal的长度//O(c) c是s中出现的字符的种类数
11.24
700. 二叉搜索树中的搜索

根据二叉搜索树的性质,如果当前key比当前节点大,就到当前节点的右子树中寻找;如果当前key比当前节点小,就到当前节点的左子树中寻找 实现方法有递归和迭代两种
class Solution {
public TreeNode searchBST(TreeNode root, int val) {
if(root==null)
return null;
if(val<root.val)
return searchBST(root.left,val);
else if(val>root.val)
return searchBST(root.right,val);
return root;
}
}
//O(n) 最坏情况下BST退化为链表
//O(n)
class Solution {
public TreeNode searchBST(TreeNode root, int val) {
while(root!=null)
{
if(root.val==val)
break;
else if(root.val>val)
root=root.left;
else if(root.val<val)
root=root.right;
}
return root;
}
}
//O(n) 最坏情况下BST退化为链表
//O(1)

