小白算法刷题Day2

  • List<List<Integer>> list :
    1.List 不能被实例化,即不能等于new List。。。。
    2.可以被实例化成ArrayList(注意AL大写)。
    3.同样内部的List<Integer> 也要被实例成ArrayList<Integer>()
    4.list.add(listTemp);之后 如果listTemp被改变了, list里的listTemp部分也被改变。因为List是引用类型, 将对象传入List的时候要new一个新的对象再添加。如:list.add(new ArrayList<Integer>(listTemp)); 值类型和引用类型的区别
  • 全排列问题解决思路:需要一个visited数组来标记某个数字是否被使用过,需要一个steps来判断当前排到第几位来,需要一个ans list来存储所有排列,需要一个possibleAns 来存储一种可能的情况,在可能的情况的长度等于nums的长度是就把它加到ans list里。在每个数字被加入到possibleAns里之后 对应的visited应该置1,然后step+1,递归调用进行下一个位置的排数,返回之后将对应数的visited置0;
    class Solution {
        public List<List<Integer>> permute(int[] nums) {
            List<List<Integer>> ans = new ArrayList<List<Integer>>();
            List<Integer> possibleAns = new ArrayList<Integer>();
            int steps = 0;
            int[] visited = new int[nums.length];
            recursiveSolution(nums, steps, ans, possibleAns, visited);
            return ans;
        }
        public void recursiveSolution(int[] nums, int steps, List<List<Integer>> ans, List<Integer> possibleAns, int[] visited){
            if(steps == nums.length){
                ans.add(new ArrayList<>(possibleAns));
                return;
            }else{
                for(int i = 0; i < nums.length; i++){
                    if(visited[i] == 1) continue;
                    visited[i] = 1;
                    possibleAns.add(nums[i]);
                    recursiveSolution(nums, steps + 1, ans, possibleAns, visited);
                    visited[i] = 0;
                    possibleAns.remove(possibleAns.size() - 1);
                }
            }
        }
    }

  • 合并两个有序链表问题:定义一个新的header,这里称为ans,和一个一直向后移动的node,起始和ans相等这里是temp。 当l1或l2中的一个值被加入到ans相应的l1和l2也要后移一位。所以,循环的判断条件是 l1 != null||l2 != null。直到遇到了,某个链表为空的情况,就把另一个链表剩下的部分直接插入到ans里,break。在比较出两个点的大小时,将小的点插入到ans里,且temp等于当前插入的点,当前点后移。
    // /**
    //  * Definition for singly-linked list.
    //  * public class ListNode {
    //  *     int val;
    //  *     ListNode next;
    //  *     ListNode() {}
    //  *     ListNode(int val) { this.val = val; }
    //  *     ListNode(int val, ListNode next) { this.val = val; this.next = next; }
    //  * }
    //  */
    class Solution {
        ListNode ans = new ListNode(0);
        ListNode temp = ans;
        public ListNode mergeTwoLists(ListNode l1, ListNode l2) {
            while(l1 != null || l2 != null){
                if(l1 == null){
                    temp.next = l2;
                    break;
                }
                else if(l2 == null)
                {
                    temp.next = l1;
                    break;
                }
                else{
                    if(l1.val > l2.val){
                        temp.next = l2;
                        temp = l2;
                        l2 = l2.next;
                    }else{
                        temp.next = l1;
                        temp = temp.next;
                        l1 = l1.next;
                    }
                }
            }
            return ans.next;
        }
    }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值