赞
踩
- class Solution {
- public int findContentChildren(int[] g, int[] s) {
- Arrays.sort(g);
- Arrays.sort(s);
- int gLen = g.length;
- int sLen = s.length;
- int i = 0;
- int j = 0;
- int count = 0;
- while (i < gLen && j < sLen) {
- while (j < sLen) {
- if (s[j] >= g[i]) {
- count++;
- break;
- }
- j++;
- }
- i++;
- j++;
- }
- return count;
- }
- }
- //这是贪心算法得,我觉得应该就是,这个题目也必须得从第一个开始啊,不可能说后几个个数比加上前面还大,所以是贪心算法得题目吧
- class Solution {
- public int wiggleMaxLength(int[] nums) {
- if (nums.length == 1) return 1;
- if (nums.length == 2 && nums[0] != nums[1]) return 2;
- //太久没写都忘记了,和前一个对比直接定义就行
- int curDiff = 0;
- int preDiff = 0;
- int count = 0;
- for (int i = 1; i < nums.length; i++) {
- curDiff = nums[i] - nums[i - 1];
- //循环得时候直接忽略掉不想等于0得时候就行
- if ((curDiff > 0 && preDiff <= 0) || (curDiff < 0 && preDiff >= 0)) {
- count++;
- preDiff = curDiff;
- }
- }
- return count + 1;
- }
- }
- //1.13贪心算法
- //明白贪心算法得意义
- class Solution {
- public int maxSubArray(int[] nums) {
- if (nums.length == 1) return nums[0];
- int count = 0;
- int sum = Integer.MIN_VALUE;
- for (int i = 0; i < nums.length; i++) {
- count += nums[i];
- sum = Math.max(sum , count);
- //那么前面那一堆肯定是最近得那个让前面总和小于0(题目是连续部分,所以这样,理解理解)
- //而且这样还把我第一次想是负数就下一个开始得思想也包含了
- if (count <= 0) count = 0;
- }
- return sum;
- }
- }
- // 贪心贪的是哪里呢?
-
- // 如果 -2 1 在一起,计算起点的时候,一定是从1开始计算,因为负数只会拉低总和,这就是贪心贪的地方!
-
- // 局部最优:当前“连续和”为负数的时候立刻放弃,从下一个元素重新计算“连续和”,因为负数加上下一个元素 “连续和”只会越来越小。
-
- // 全局最优:选取最大“连续和”
-
- // 局部最优的情况下,并记录最大的“连续和”,可以推出全局最优。
-
- // 从代码角度上来讲:遍历nums,从头开始用count累积,如果count一旦加上nums[i]变为负数,那么就应该从nums[i+1]开始从0累积count了,因为已经变为负数的count,只会拖累总和。
- // 贪心思路
- //自己考虑得那中大范围跨度,比两个小范围跨度大是错误得
- class Solution {
- public int maxProfit(int[] prices) {
- int result = 0;
- for (int i = 1; i < prices.length; i++) {
- result += Math.max(prices[i] - prices[i - 1], 0);
- }
- return result;
- }
- }
- class Solution {
- public boolean canJump(int[] nums) {
- if (nums.length == 1) {
- return true;
- }
- //覆盖范围, 初始覆盖范围应该是0,因为下面的迭代是从下标0开始的
- int coverRange = 0;
- //在覆盖范围内更新最大的覆盖范围
- for (int i = 0; i <= coverRange; i++) {
- coverRange = Math.max(coverRange, i + nums[i]);
- if (coverRange >= nums.length - 1) {
- return true;
- }
- }
- return false;
- }
- }
- class Solution {
- public int jump(int[] nums) {
- if (nums == null || nums.length == 0 || nums.length == 1) {
- return 0;
- }
- //记录跳跃的次数
- int count=0;
- //当前的覆盖最大区域
- int curDistance = 0;
- //最大的覆盖区域
- int maxDistance = 0;
- for (int i = 0; i < nums.length; i++) {
- //在可覆盖区域内更新最大的覆盖区域
- maxDistance = Math.max(maxDistance, i+nums[i]);
- //说明当前一步,再跳一步就到达了末尾
- if (maxDistance >= nums.length-1) {
- count++;
- break;
- }
- //走到当前覆盖的最大区域时,更新下一步可达的最大区域
- if (i == curDistance) {
- curDistance = maxDistance;
- count++;
- }
- }
- return count;
- }
- }
- class Solution {
- public int largestSumAfterKNegations(int[] nums, int k) {
- // 排序,把可能有的负数排到前面
- Arrays.sort(nums);
- int sum = 0;
- for (int i = 0; i < nums.length; i++) {
- // 贪心:如果是负数,而k还有盈余,就把负数反过来
- if (nums[i] < 0 && k > 0) {
- nums[i] = -1 * nums[i];
- k--;
- }
- sum += nums[i];
- }
- Arrays.sort(nums);
- // 如果k没剩,那说明能转的负数都转正了,已经是最大和,返回sum
- // 如果k有剩,说明负数已经全部转正,所以如果k还剩偶数个就自己抵消掉,不用删减,如果k还剩奇数个就减掉2倍最小正数。
- return sum - (k % 2 == 0 ? 0 : 2 * nums[0]);
- }
- }
-
-
- class Solution {
- public int largestSumAfterKNegations(int[] nums, int K) {
- // 将数组按照绝对值大小从大到小排序,注意要按照绝对值的大小
- nums = IntStream.of(nums)
- .boxed()
- .sorted((o1, o2) -> Math.abs(o2) - Math.abs(o1))
- .mapToInt(Integer::intValue).toArray();
- int len = nums.length;
- for (int i = 0; i < len; i++) {
- //从前向后遍历,遇到负数将其变为正数,同时K--
- if (nums[i] < 0 && K > 0) {
- nums[i] = -nums[i];
- K--;
- }
- }
- // 如果K还大于0,那么反复转变数值最小的元素,将K用完
-
- if (K % 2 == 1) nums[len - 1] = -nums[len - 1];
- return Arrays.stream(nums).sum();
-
- }
- }
- // 解法2
- class Solution {
- public int canCompleteCircuit(int[] gas, int[] cost) {
- int curSum = 0;
- int totalSum = 0;
- int index = 0;
- for (int i = 0; i < gas.length; i++) {
- curSum += gas[i] - cost[i];
- totalSum += gas[i] - cost[i];
- if (curSum < 0) {
- index = (i + 1) % gas.length ;
- curSum = 0;
- }
- }
- if (totalSum < 0) return -1;
- return index;
- }
- }
- class Solution {
- public boolean lemonadeChange(int[] bills) {
- int cash_5 = 0;
- int cash_10 = 0;
-
- for (int i = 0; i < bills.length; i++) {
- if (bills[i] == 5) {
- cash_5++;
- } else if (bills[i] == 10) {
- cash_5--;
- cash_10++;
- } else if (bills[i] == 20) {
- if (cash_10 > 0) {
- cash_10--;
- cash_5--;
- } else {
- cash_5 -= 3;
- }
- }
- if (cash_5 < 0 || cash_10 < 0) return false;
- }
-
- return true;
- }
- }
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。