数组-day03-待补充-119/121/136

77 阅读2分钟

第一题

题目

定一个非负索引 rowIndex,返回「杨辉三角」的第 rowIndex行。 在「杨辉三角」中,每个数是它左上方和右上方的数的和。

思路

这道题最开始的思路和昨天杨辉三角思路一样,但是咱也不能天天一点进步也没有啊,是吧,优化一下空间。

代码

    public List<Integer> getRow(int rowIndex) {
        List<Integer> row = new ArrayList<Integer>();
        row.add(1);
        for(int i = 1; i < rowIndex + 1; i++) {
            row.add(0);
            for(int j = i; j > 0; j--) {
                row.set(j, row.get(j-1) + row.get(j));
            };
        };
        return row;
    }

第二题

题目

给定一个数组 prices ,它的第 i 个元素 prices[i] 表示一支给定股票第 i 天的价格。

你只能选择 某一天 买入这只股票,并选择在 未来的某一个不同的日子 卖出该股票。设计一个算法来计算你所能获取的最大利润。

返回你可以从这笔交易中获取的最大利润。如果你不能获取任何利润,返回 0 。

思路

暴力破解超出时间限制,啧!

这是官方题解: 据说使用动态规划, 假设,前i天的最高利润为数组daysMax[i];

第i天的利润为prices[i] - min(prices[0], prices[1],... prices[i - 1]);

那么第i天的最高利润为daysMax[i] = max(daysMax[i-1], prices[i] - min(prices[0], prices[1],... prices[i - 1]);

所以最高利润为数组daysMaxmax

这是复习时候自己想出来的 大同小异吧,设置min为第i天之前的最小值,max为截止到第i天最大的获利-代码看上去比上面的易懂

代码

    public int maxProfit(int[] prices) {
        int minNum = prices[0];
		int[] dp = new int[prices.length];
		int maxValue = 0;
		for(int i = 1; i < prices.length; i++) {
			int prefer = prices[i] - minNum;
			dp[i] = prefer > 0 ? prefer : 0;
			dp[i] = dp[i - 1] - dp[i] > 0 ? dp[i - 1] : dp[i];
			maxValue = maxValue > dp[i] ? maxValue : dp[i];
			if(prices[i] < minNum) {
				minNum = prices[i];
			};
		};
        return maxValue;
    }

复习后的代码

    public int maxProfit(int[] prices) {
        if(prices.length == 1) return 0;
        int minPre = prices[0], maxRes = 0;
        for(int i = 1; i < prices.length; i++) {
            maxRes = Math.max(prices[i] - minPre, maxRes);
            minPre = Math.min(minPre, prices[i]);
        };
        return maxRes;
    }

第三题

题目

给你一个 非空 整数数组 nums ,除了某个元素只出现一次以外,其余每个元素均出现两次。找出那个只出现了一次的元素。 你必须设计并实现线性时间复杂度的算法来解决此问题,且该算法只使用常量额外空间。

思路

1、暴力破解-不写了

2、排序,然后递归查找-不想写,有时间补充

3、还有哈希,这个有时间补充一下

没了,但是,发现了一个非常6的方法,异或

代码

异或

    public int singleNumber(int[] nums) {
        // 暴力破解不写了,怕又有什么超出限制
        // 异或666
        int res = nums[0];
        for(int i = 1; i < nums.length; i++) {
            res = res ^ nums[i];
        }
        return res;
    }

代码释义

两两异或就只剩0了,然后0再和最后的一个数字异或得到最终值