斐波那契数列&&最长回文子串&&数组中相加和为0的三元组

180 阅读1分钟

NC65 斐波那契数列

题目链接

1、解题思路
  • 简单往前推就好了
2、代码
public class Solution {
    public int Fibonacci(int n) {
        if(n == 0){
            return 0;
        }else if(n == 1 || n == 2){
            return 1;
        }else{
            int a = 1;
            int b = 1;
            for(int i = 3;i <= n;i++){
                int c = b;
                b = b + a;
                a = c;
            }
            return b;
        }
    }
}

NC17 最长回文子串

题目链接

1、解题思路
  • dp,类似那个区间dp,但是这个题目需要从后面往前面推。
2、代码
import java.util.*;

public class Solution {
    public int getLongestPalindrome(String str, int n) {
        // write code here
        boolean[][] dp = new boolean[n][n];
        int len = -1;
        for(int i = n - 1;i >= 0;i--){
            for(int l = 0;i + l < n;l++){
                int j = i + l;
                if(l == 0){
                    dp[i][j] = true;
                }else if(l == 1){
                    dp[i][j] = str.charAt(i) == str.charAt(j);
                }else{
                    dp[i][j] = str.charAt(i) == str.charAt(j) && dp[i+1][j-1];
                }
                if(dp[i][j] && j - i + 1 > len){
                    len = j - i + 1;
                }
            }
        }
        return len;
    }
}

NC54 数组中相加和为0的三元组

题目链接

1、解题思路
  • 首先,对数组进行排序。
  • 其次,固定一个起点,剩余的双指针归并。注意,要去重。
2、代码
import java.util.*;
public class Solution {
    public ArrayList<ArrayList<Integer>> threeSum(int[] nums) {
        ArrayList<ArrayList<Integer>> list = new ArrayList<>();
        Arrays.sort(nums);
        for(int i = 0;i < nums.length - 2;i++){
            if(i != 0 && nums[i] == nums[i-1]){
                continue;
            }
            int l = i + 1;
            int r = nums.length - 1;
            int sum = 0 - nums[i];
            while(l < r){
                if(nums[l] + nums[r] == sum){
                    ArrayList<Integer> temp = new ArrayList<>();
                    temp.add(nums[i]);
                    temp.add(nums[l]);
                    temp.add(nums[r]);
                    list.add(temp);
                    int ll = l;
                    int rr = r;
                    l++;
                    r--;
                    while(l < r && nums[l] == nums[ll]){
                        l++;
                    }
                    while(l < r && nums[r] == nums[rr]){
                        r--;
                    }
                }else if(nums[l] + nums[r] > sum){
                    r--;
                }else{
                    l++;
                }
            }
        }
        return list;
    }
}