1、给定一个整数数组 nums ,找到一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和。
- 贪心算法
 
public int maxSubArray(int[] nums) {
     int n = nums.length;
     int currSum = nums[0], maxSum = nums[0];
    for(int i = 1; i < n; ++i) {
       currSum = Math.max(nums[i], currSum + nums[i]);
       maxSum = Math.max(maxSum, currSum);
     }
     return maxSum;
   }
复杂度分析
- 时间复杂度:O(N)。只遍历一次数组。
 - 空间复杂度:O(1),只使用了常数空间。
 
- 动态规划法
 
public int maxSubArray(int[] nums) {
     int n = nums.length, maxSum = nums[0];
     for(int i = 1; i < n; ++i) {
       if (nums[i - 1] > 0) nums[i] += nums[i - 1];
       maxSum = Math.max(nums[i], maxSum);
     }
     return maxSum;
   }
2、单链表反转: 比如1→2→3→4→5,反转之后返回5→4→3→2→1
public static Node(Node head){
if(head==null && head.next == null) return head;
Node reHead = null;
Node cur = head;
while(cur!=null){
Node reCur = cur;
cur = cur.next;
reCur.next = reHead;
reHead = reCur;
}
return reHead;
}

京公网安备 11010502036488号