算法(二十三)
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;
}
根据自己所见所闻进行算法归纳总结