目录
1.n个节点的二叉树种类
思考:1个节点种类数为1,2个节点种类数为2,n个节点可以可以分成左边0个右边n-1个、左边1个右边n-2个.....左边n-1个右边0个,可以使用递归方法解决。
private static int process(int n) {
if (n<2)
return 1;
if (n==2)
return 2;
int res=0;
for (int i = 0; i < n; i++) {
int leftNum = process(i);
int rightNum = process(n-1-i);
res += (leftNum*rightNum);
}
return res;
}
转换为动态规划
private static int process1(int n)
{
int[] dp = new int[n+1];
dp[0]=1;
for (int i = 1; i < n+1; i++) {
for (int j = 0; j < i; j++) {
dp[i]+=(dp[j]*dp[i-1-j]);
}
}
return dp[n];
}
2.括号串匹配问题
思考:在遍历括号串时,定义count用于计算左括号数量,当遇到右括号时,抵消一个左括号count--;当某一时刻count<0或者最后count!=0,则括号串不匹配。若要使得括号匹配则需要在count==-1时添加左括号,若最后count!=0,则需要在右边边添加count数量的右括号。
public static void main(String[] args) {
String s = "()()()))()()";
int count = 0;
int ans = 0;
for (int i = 0; i < s.length(); i++) {
if(s.charAt(i)=='(')
count++;
else {
if(count==0)
{
ans++;
}
else{
count--;
}
}
}
ans+=count;
System.out.println(ans);
}
3.数组中的 k-diff 数对(leetcode532)
给你一个整数数组 nums 和一个整数 k,请你在数组中找出 不同的 k-diff 数对,并返回不同的 k-diff 数对 的数目。
k-diff 数对定义为一个整数对 (nums[i], nums[j]) ,并满足下述全部条件:
0 <= i, j < nums.length
i != j
nums[i] - nums[j] == k
注意,|val| 表示 val 的绝对值。
public int findPairs(int[] nums, int k) {
HashMap<Integer,Integer> map = new HashMap<>();
for (int i = 0; i < nums.length; i++) {
if (map.containsKey(nums[i]))
map.put(nums[i],map.get(nums[i])+1);
else
map.put(nums[i],1);
}
int count = 0;
for(int i : map.keySet())
{
// k==0时要单独考虑
if (k==0)
{
if (map.get(i)>1)
count++;
}else {
if (map.containsKey(i+k))
count++;
}
}
return count;
}
4.增大两个集合的平均值
思考:若两个集合平均值相等,则两个集合平均值不可能都相加;不相等时,只有平均值大的集合向平均值小的集合输送且去除的数据必须大于minAvg小于maxAvg。
private static int maxOps(int[] arr1, int[] arr2) {
double sum1=0;
for (int i = 0; i < arr1.length; i++) {
sum1+=(double) arr1[i];
}
double sum2=0;
for (int i = 0; i < arr2.length; i++) {
sum2+=(double) arr2[i];
}
if (avg(sum1,arr1.length)==avg(sum2,arr2.length)){
return 0;
}
int[] maxArr = null;
double maxSum = 0;
int[] minArr = null;
double minSum = 0;
if (avg(sum1,arr1.length)<avg(sum2,arr2.length)){
maxArr=arr2;
maxSum=sum2;
minArr=arr1;
minSum=sum1;
}else {
maxArr=arr1;
maxSum=sum1;
minArr=arr2;
minSum=sum2;
}
int ops=0;
int moreSize = maxArr.length;
int lessSize = minArr.length;
Arrays.sort(maxArr);
HashSet<Integer> set = new HashSet<>();
for (int i = 0; i < lessSize; i++) {
set.add(minArr[i]);
}
for (int i = 0; i < maxArr.length; i++) {
int temp = maxArr[i];
if (temp>=avg(maxSum,moreSize))
{
break;
}
if (temp>avg(minSum,lessSize)&&(!set.contains(temp))){
System.out.println(temp);
minSum+=temp;
maxSum-=temp;
moreSize--;
lessSize++;
ops++;
}
}
return ops;
}
private static double avg(double sum1, int length) {
return sum1/length;
}